详解Linux文本三剑客

news2024/10/7 4:27:37

目录

一、grep

1.什么是grep?

2.如何使用?

3.正则

二、sed

1.认识sed?

2.如何使用?

三、awk(重点)

1.awk变量

1.1内置变量

1.2自定义变量

2.awk数组

四、经典实战案例

案例一:筛选IPv4地址

案例二:根据某字段去重

案例三: 统计TCP连接状态数

案例四:统计独立IP

案例五:处理字段缺失的数据

案例六:筛选给定时间范围内的日志


一、grep

1.什么是grep?

Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来(匹配到的标红)。全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

2.如何使用?

命令格式:grep  [option]  pattern  file

参数选择(option):

  • -A<显示行数>:除了显示符合范本样式的那一列之外,并显示该行之后的内容。

  • -B<显示行数>:除了显示符合样式的那一行之外,并显示该行之前的内容。

  • -C<显示行数>:除了显示符合样式的那一行之外,并显示该行之前后的内容。

  • -c:统计匹配的行数

  • -e :实现多个选项间的逻辑or 关系

  • -E:扩展的正则表达式

  • -f FILE:从FILE获取PATTERN匹配

  • -F :相当于fgrep

  • -i --ignore-case #忽略字符大小写的差别。

  • -n:显示匹配的行号

  • -o:仅显示匹配到的字符串

  • -q: 静默模式,不输出任何信息

  • -s:不显示错误信息。

  • -v:显示不被pattern 匹配到的行,相当于[^] 反向匹配

  • -w :匹配 整个单词

3.正则

格式:

  • . 匹配任意单个字符,不能匹配空行

  • [] 匹配指定范围内的任意单个字符

  • [^] 取反

  • [:alnum:] 或 [0-9a-zA-Z]

  • [:alpha:] 或 [a-zA-Z]

  • [:upper:] 或 [A-Z]

  • [:lower:] 或 [a-z]

  • [:blank:] 空白字符(空格和制表符)

  • [:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)

  • [:cntrl:] 不可打印的控制字符(退格、删除、警铃...)

  • [:digit:] 十进制数字 或[0-9]

  • [:xdigit:]十六进制数字

  • [:graph:] 可打印的非空白字符

  • [:print:] 可打印字符

  • [:punct:] 标点符号

  • * 匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配

  • .* 任意前面长度的任意字符,不包括0次

  • \? 匹配其前面的字符0 或 1次

  • + 匹配其前面的字符至少1次

  • {n} 匹配前面的字符n次

  • {m,n} 匹配前面的字符至少m 次,至多n次

  • {,n} 匹配前面的字符至多n次

  • {n,} 匹配前面的字符至少n次

注:以上为正则的基本知识,进一步了解可以点击此链接。python正则表达式和断言_第1关:先行断言_《^O^》杜的博客-CSDN博客

二、sed

1.认识sed?

sed 是一种流编辑器,一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,接着用sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕 ,然后读入下行,执行下一个循环。

2.如何使用?

命令格式:sed  [options]  '[地址定界] command'` `file``(s)

选项(options):

  • -n:不输出模式空间内容到屏幕,即不自动打印,只打印匹配到的行

  • -e:多点编辑,对每行处理时,可以有多个Script

  • -f:把Script写到文件当中,在执行sed时-f 指定文件路径,如果是多个Script,换行写

  • -r:支持扩展的正则表达式

  • -i:直接将处理的结果写入文件

  • -i.bak:在将处理的结果写入文件之前备份一份

地址定界:

  • 不给地址:对全文进行处理

  • 单地址:#: 指定的行       /pattern/:被此处模式所能够匹配到的每一行

  • 地址范围:#,#    #,+#   /pat1/,/pat2/   #,/pat1/

  • ~:步进    sed -n '1~2p' 只打印奇数行 (1~2 从第1行,一次加2行) sed -n '2~2p' 只打印偶数行

command:

  • d:删除模式空间匹配的行,并立即启用下一轮循环

  • p:打印当前模式空间内容,追加到默认输出之后

  • a:在指定行后面追加文本,支持使用\n实现多行追加

  • i:在行前面插入文本,支持使用\n实现多行追加

  • c:替换行为单行或多行文本,支持使用\n实现多行追加

  • w:保存模式匹配的行至指定文件

  • r:读取指定文件的文本至模式空间中匹配到的行后

  • =:为模式空间中的行打印行号

  • !:模式空间中匹配行取反处理

三、awk(重点)

1.awk变量

1.1内置变量

  • FS :输入字段分隔符,默认为空白字符

  • OFS :输出字段分隔符,默认为空白字符

  • RS :输入记录分隔符,指定输入时的换行符,原换行符仍有效

  • ORS :输出记录分隔符,输出时用指定符号代替换行符

  • NF :字段数量,共有多少字段, $NF引用最后一列,$(NF-1)引用倒数第2列

  • NR :行号,后可跟多个文件,第二个文件行号继续从第一个文件最后行号开始

  • FNR :各文件分别计数, 行号,后跟一个文件和NR一样,跟多个文件,第二个文件行号从1开始

  • FILENAME :当前文件名

  • ARGC :命令行参数的个数

  • ARGV :数组,保存的是命令行所给定的各参数,查看参数

1.2自定义变量

注:自定义变量区分字符大小写。

(1)-v var=value

举例:第一种:先定义变量,后执行动作print

awk -v name="along" -F: '{print name":"$0}' awkdemo

第二种:在执行动作print后定义变量

 awk -F: '{print name":"$0;name="along"}' awkdemo

(2)可以把执行的动作放在脚本中,直接调用脚本 -f

写一个脚本awk.txt ,内容为:{name="along";print name,$1}

使用:awk -F: -f awk.txt awkdemo

2.awk数组

关联数组:

(1)可使用任意字符串;字符串要使用双引号括起来

(2)如果某数组元素事先不存在,在引用时,awk 会自动创建此元素,并将其值初始化为“空串”

(3)若要判断数组中是否存在某元素,要使用“index in array”格式进行遍历

(4)若要遍历数组中的每个元素,要使用for 循环:for(var in array) {for-body}

四、经典实战案例

案例一:筛选IPv4地址

从ifconfig命令的结果中筛选出除了lo网卡外的所有IPv4地址。

案例二:根据某字段去重

法一:
[root@dyj ~]# awk -F"?" '!arr[$2]++{print}' a.txt
200~2019-01-13_12:00_index?uid=123
2019-01-13_14:00_index?uid=333
2019-01-13_15:00_index?uid=9710
法二:
[root@dyj ~]# cat a.txt | awk -F"?" '{arr[$2]=arr[$2]+1;if(arr[$2]==1){print}}'
200~2019-01-13_12:00_index?uid=123
2019-01-13_14:00_index?uid=333
2019-01-13_15:00_index?uid=9710
法三:
[root@dyj ~]# cat a.txt |awk -F"?" '{arr[$2]++;if(arr[$2]==1){print}}'
200~2019-01-13_12:00_index?uid=123
2019-01-13_14:00_index?uid=333
2019-01-13_15:00_index?uid=9710

案例三: 统计TCP连接状态数

案例四:统计独立IP

统计每个URL的独立访问IP有多少个(去重),并且要为每个URL保存一个对应的文件。

[root@dyj ~]# cat log.txt | awk 'BEGIN{FS="|"}!arr[$1,$2]++{arr1[$1]++}END{for(i in arr1){print i,arr1[i]}}'          
a.com.cn 2
c.com.cn 1
b.com.cn 2
[root@dyj ~]# cat log.txt | awk 'BEGIN{FS="|"}!arr[$1,$2]++{arr1[$1]++}END{for(i in arr1){print i,arr1[i]>(i".txt")}}'
[root@dyj ~]# find /root -name "*.com.cn.txt"
/root/b.com.cn.txt
/root/a.com.cn.txt
/root/c.com.cn.txt

案例五:处理字段缺失的数据

当字段缺失时,直接使用FS划分字段来处理会非常棘手。gawk为了解决这种特殊需求,提供了FIELDWIDTHS变量。FIELDWIDTH可以按照字符数量划分字段。

案例六:筛选给定时间范围内的日志

 grep/sed/awk用正则去筛选日志时,如果要精确到小时、分钟、秒,则非常难以实现。但是awk提供了mktime()函数,它可以将时间转换成epoch时间值。

[root@dyj ~]# awk 'BEGIN{print mktime("2019 11 10 03 42 40")}'
1573328560

BEGIN{
  # 要筛选什么时间的日志,将其时间构建成epoch值
  which_time = mktime("2019 11 10 03 42 40")
}
{
  # 取出日志中的日期时间字符串部分
  match($0,"^.*\\[(.*)\\].*",arr)
  
  # 将日期时间字符串转换为epoch值
  tmp_time = strptime2(arr[1])
  
  # 通过比较epoch值来比较时间大小
  if(tmp_time > which_time){
    print 
  }
}
# 构建的时间字符串格式为:"10/Nov/2019:23:53:44+08:00"
function strptime2(str,dt_str,arr,Y,M,D,H,m,S) {
  dt_str = gensub("[/:+]"," ","g",str)
  # dt_sr = "10 Nov 2019 23 53 44 08 00"
  split(dt_str,arr," ")
  Y=arr[3]
  M=mon_map(arr[2])
  D=arr[1]
  H=arr[4]
  m=arr[5]
  S=arr[6]
  return mktime(sprintf("%s %s %s %s %s %s",Y,M,D,H,m,S))
}
function mon_map(str,mons){
  mons["Jan"]=1
  mons["Feb"]=2
  mons["Mar"]=3
  mons["Apr"]=4
  mons["May"]=5
  mons["Jun"]=6
  mons["Jul"]=7
  mons["Aug"]=8
  mons["Sep"]=9
  mons["Oct"]=10
  mons["Nov"]=11
  mons["Dec"]=12
  return mons[str]
}

以上为Linux的文本三剑客的详解,还有不足之处后期将进一步完善。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/860438.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为MySQL新增一张performance_schema表 | StoneDB 技术分享会 #4

StoneDB开源地址 https://github.com/stoneatom/stonedb 设计&#xff1a;小艾 审核&#xff1a;丁奇、李浩 编辑&#xff1a;宇亭 作者&#xff1a;王若添 中国科学技术大学-软件工程-在读硕士、StoneDB 内核研发实习生 performance_schema 简介 MySQL 启动后会自动创建四…

基于SpringBoot+LayUI的宿舍管理系统 001

项目简介 源码来源于网络&#xff0c;项目文档仅用于参考&#xff0c;请自行二次完善哦。 系统以MySQL 8.0.23为数据库&#xff0c;在Spring Boot SpringMVC MyBatis Layui框架下基于B/S架构设计开发而成。 系统中的用户分为三类&#xff0c;分别为学生、宿管、后勤。这三…

【MySQL常见面试题】

索引的基本原理 索引⽤来快速地寻找那些具有特定值的记录。如果没有索引&#xff0c;⼀般来说执⾏查询时遍历整张表。 索引的原理&#xff1a;就是把⽆序的数据变成有序的查询 把创建了索引的列的内容进⾏排序 对排序结果⽣成倒排表 在倒排表内容上拼上数据地址链 在查询的…

计算机网络:网络通信相关概念入门

目录 一、网络发展背景二、理解网络通信三、理解IP地址1.简述IP地址2.IP地址的版本3.提高地址利用率的技术 四、理解端口1.简述端口2.使用端口的原因 五、理解网络通信协议 一、网络发展背景 网络发展背景&#xff1a; 最初的计算机是单机&#xff0c;那么单机是这样传输数据的…

谁是5G应用的狮子座?

8月5日&#xff0c;广和通公布2023年上半年财报&#xff0c;2023上半年总营业收入38.65亿元&#xff0c;同比增长59.87%。在全球经济存在诸多不确定性的背景下&#xff0c;广和通精准预判市场风向&#xff0c;制定稳健发展策略&#xff0c;业绩仍保持逆势增长。其中&#xff0c…

详谈基于布局分析的表格识别方法

基于布局分析的OCR&#xff08;Optical Character Recognition&#xff09;是一种基于页面布局信息的文本识别方法。传统的OCR系统通常依赖于表格线或者特定的格式来进行文本区域检测和字符识别&#xff0c;但对于一些表格线不全或线不清晰&#xff0c;甚至没表格线&#xff0c…

协程(一)单机--》并发--》协程

目录 一 协程的概述1.1 并行与并发1.2 线程1.3 新的思路1.4 Goroutine 二 第一个入门程序 一 协程的概述 我查看了网上的一些协程的资料&#xff0c;发现每个人对协程的概念都不一样&#xff0c;但是我认可的一种说法是&#xff1a;协程就是一种轻量级的线程框架&#xff08;K…

去趋势化一个心电图信号、信号功率谱、低通IIR滤波器并平滑信号、对滤波器引起的延迟进行补偿研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【C语言进阶篇】关于指针的八个经典笔试题(图文详解)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言&#x1f4ac; 指针笔试题&#x1f4ad; 笔试题 1&#xff1a;✅ 代码解析⁉️ 检验结果&…

二叉树(4)------收尾

1)最大二叉树 654. 最大二叉树 - 力扣&#xff08;LeetCode&#xff09; 题目解析: 1)首先我们找到了整个数组中最大的元素作为我们的根节点&#xff0c;然后再从左区间中找到最大的元素作为当前根节点的左子树&#xff0c;然后再从右区间里面找到最大的元素作为根节点的右子树…

【OpenVINOSharp】 基于C#和OpenVINO2023.0部署Yolov8全系列模型

基于C#和OpenVINO2023.0部署Yolov8全系列模型 1 项目简介1.1 OpenVINOTM 2 OpenVinoSharp2.1 OpenVINOTM 2023.0安装配置2.2 C 动态链接库2.3 C#构建Core推理类2.4 NuGet安装OpenVinoSharp 3 获取和转换Yolov8模型3.1 安装ultralytics3.2 导出yolov8模型3.3 安装OpenVINOTM Pyt…

杭电多校 Rikka with Square Numbers 费马平方和定理

&#x1f468;‍&#x1f3eb; Rikka with Square Numbers &#x1f9c0; 参考题解 &#x1f37b; AC code import java.util.Scanner;public class Main {static boolean isSqu(int x){int t (int) Math.sqrt(x);return t * t x;}public static void main(String[] args…

Vue2:组件基础(上)

Vue2&#xff1a;组件基础&#xff08;上&#xff09; Date: July 29, 2023 Sum: 生命周期、Vue-cli、组件的使用、小黑记账清单、小兔鲜首页 生命周期&#xff1a; 生命周期介绍 思考&#xff1a; 什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#x…

Aviator这么丝滑,怎么实现的呢?

大家好&#xff0c;我是老三&#xff0c;在上期 里我们介绍了轻量级规则引擎AviatorScript的基本用法和一些使用案例&#xff0c;这期我们来研究一下&#xff0c;这么丝滑的规则脚本是怎么实现的。 概览 我们先来回顾一个简单的例子&#xff1a; Testpublic void test(){//表…

一道RSA题(忘了名字)-云上贵州-网络安全攻防竞赛个人赛

题目&#xff1a; 很遗憾&#xff0c;这道题当时没做出来。 话不多说&#xff0c;直接开始&#xff0c;题目只给了一个式子&#xff0c;这里就命名为hint&#xff1a; 最开始我的想法是化为模q的形式&#xff0c;也就是&#xff1a; 然后就变成了&#xff1a; 接着就一直卡在这…

国产数据库排行

目录 一、理论 1.国产数据库排行 2.数据 一、理论 1.国产数据库排行 &#xff08;1&#xff09;墨天轮榜单 墨天轮国产数据库流行度排行于2019年6月推出&#xff0c;通过近50个维度的数据来考察近300个国产数据库的流行度排行&#xff0c;每月1日更新排行数据&#xff0c…

js 使用 Object.defineProperty() 对属性进行限制 06

小夏小夏&#xff0c;可爱到爆炸 &#x1f923; &#x1f495;&#x1f495;&#x1f495; 文章目录 一、对属性操作的控制二、属性描述符三、数据属性描述符四、存取属性描述符五、vue2 响应式原理六、defineProerties 同时定义多个属性七、对象方法补充 一、对属性操作的控制…

勘探开发人工智能技术:机器学习(5)

0 提纲 6.1 矩阵分解 6.2 全连接 BP 神经网络 6.3 卷积神经网络 6.4 LSTM 6.5 Transformer 6.6 U-Net 1 矩阵分解 把稀疏矩阵分解成两个小矩阵的乘积, 恢复后的矩阵用于预测. 1.1 基本概念 矩阵分解是使用数学应对机器学习问题的一类典型而巧妙的方法. 矩阵分解是把将一个…

数字万用表测量基础知识--DMM的显示位数

概览 DMM&#xff08;即数字万用表&#xff09;是一种电气测试和测量仪器&#xff0c;可测量直流和交流信号的电压、电流和电阻。本文介绍如何正确使用和理解数字万用表(DMM)。 DMM的显示位数 数字万用表(DMM)可用于进行各种测量。在选择DMM或理解所使用的DMM时&#xff0c;首…

jupyter切换conda虚拟环境

环境安装 conda install nb_conda 进入你想使用的虚拟环境&#xff1a; conda activate your_env_name 在你想使用的conda虚拟环境中&#xff1a; conda install -y jupyter 在虚拟环境中安装jupyter&#xff1a; conda install -y jupyter 重启jupyter 此时我们已经把该安装…