下面所说的是Linux中最重要的三个命令在业界被称为“三剑客”,它们是awk,sed,grep。  我们现在知道Linux下一切皆文件,对Linux的操作就是对文件的处理,那么怎么能更好的处理文件呢?这就要用到我们上面的三剑客命令。 三剑客的功能非常强大,但我们只需要掌握他们分别擅长的领域即可:grep擅长查找功能,sed擅长取行和替换。awk擅长取列。 grep 1.分类  grep命令家族由grep, egrep, fgrep 三个子命令组成,适用于不同的场景。具体如下:

grep 原生的grep命令,使用“标准正则表达式”作为匹配标准。

egrep 扩展的grep命令,相当于$(grep -E),使用“扩展正则表达式”作为匹配标准。

fgrep 简化版的grep命令,不支持正则表达式,但搜索速度快,系统资源使用率低。

pgrep查看当前正在运行的进程,并将与选择条件匹配的进程ID列出到stdout(屏幕)。当你想要某个进程的PID时,pgrep很方便。

2.使用方法 

语法

grep [options] PATTERN [FILE...]

options部分

-i:忽略大小写

--color:高亮匹配上的字符串

-v: 显示没有被模式匹配到的行

  • -n 显示匹配的行号
  • -c 统计匹配的行数
  • -o 仅显示匹配到的字符串
  • -q 静默模式,不输出任何信息
  • -A # after, 后#行
  • -B # before, 前#行
  • -C # context, 前后各#行
  • -e 实现多个选项间的逻辑or关系
  • -w 匹配整个单词
  • -E 使用ERE,相当于egrep
  • -F 相当于fgrep,不支持正则表达式

  • PATTERN部分
    以字符串的方式给定匹配模板,可以使用普通字符串以及正则表达式(标准&扩展)。

FILE部分

需要查找内容的文件。

3.举例

1).查找指定进程和个数

[root@VM-0-12-centos ~]# ps -ef | grep redisroot      7934  7859  0 11:00 pts/0    00:00:00 grep --color=auto redispolkitd  21437 21421  0 Sep22 ?        00:10:02 redis-server 127.0.0.1:6379

2).统计2020年9月29日 PV量

grep '29/Sep/2020' text.txt | wc -l

3).过滤ip地址

egrep -o "([0-9]{1,3}\.){3}[0-9]"

sed

1.概述

sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’ 的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。


grep 匹配上下两行 grep匹配换行_grep 匹配上下两行

2.基本语法

sed [option] 'script' [input file]...

option部分

-n:不输出模式空间中的内容到stdout

-e:可以在sed命令中指定多个script脚本,多点编辑功能

-f:输入sed脚本,脚本中写着编辑命令

-r:支持使用扩展的正则

-i:直接编辑源文件


script部分


地址定界编辑命令(和vim命令相似)

1)空地址:全文编辑

2)单地址:

#:指定某一行,对特定行进行编辑

/pattern/:指定模式匹配到的那一行

3)地址范围:

#,#

#,+#

#,/pattern/

/pattern1/,/pattern2/

4)步进地址:

1~2:以1为起始行,然后递进2行向下匹配

2~2:所有偶数行

5)编辑命令:


  d:删除整行,d放在最后


  p:显示模式空间中的内容, 放在最后


  a:在匹配的行后面增加文本,使用\n支持多行追加。a放在定界后面


  i:在前面加文本。举例:sed '3i hello' xxx


  c:替换行为指定的文本。举例:sed '3c text' xxx 把第三行替换成text。sed -i '/xyz/c helloworld' num.txt


  w:保存模式空间中匹配的内容到指定位置。举例:sed -n '/[#]/w /tmp/demo' /etc/fstab 将/etc/fstab中非#开头的行保存到/tmp/demo中。


  r:读取指定文件的内容添加到当前文件匹配到的行后面,进行文件合并。


  !:条件取反。用法:地址定界!编辑命令。


  s///:条件替换。


替换标记备注:g(全局替换),p(显示替换成功的行)

3.举例

1).打印指定的行数


sed -n 2p text.txt # 打印第二行的内容sed -n 5,9p text.txt # 打印第五行到第九行的内容


2).将文件中的root全部替换为abc


sed -i 's/root/adb/g' text.txt


awk

1.概述


awk是一个报表生成器,主要用于格式化输出。格式化文本输出器。

grep 匹配上下两行 grep匹配换行_linux 统计文件行数_02


2.基本语法


语法

gawk [option] 'program' FILE

其中program: PATTERN{ACTION STATEMENTS}

{动作指令}可以理解成为命令,最常用的是print、printf


awk读取文档过程

按照行来读取文档,根据输入分隔符切分成小部分(用內建变量来表示$0$1$2...),用ACTION STATEMENTS来处理。$0表示显示整行。 选项option

-F:指名输入字段的分隔符; -v:用来实现自定义变量var=value; PATTERN(用于定界)

空: 表示处理文件的每一行 / pattern/: 使用正则匹配需要处理的行 !/pattern/: 上面取反 关系表达式: 结果为真假,结果为真的处理,假的不处理。 非0非空字符串为真,其余为假。

 行定界:不支持直接给出数字的格式(1,2{...})。
 BEGIN/END模式:BEGIN{}表示仅在开始处理文件中的文本之前执行一次的程序,例如打印表头。END{}表示文本处理完成之后执行一次。


变量

內建变量 (在引用变量时不用加$) FS : input field seperator: 输入字段分隔符,默认空白字符。 使用-v指定。 OFS : 输出字段分隔符。 使用-v指定。 R S : 输入时的换行符 ORS : 输出时的换行符 NF : number of field 每一行的字段数量。 加上$NF表示最后一列 NR : number of record 文件的行数,打印出来是打印行号 FNR : 多个文件中的行数分别计数 FILENAME : 当前文件的文件名 ARGC : 参数命令行中参数的个数 A RGV : 返回数组,命令行中的每个参数

3.举例

1).统计2020年9月29日一天内访问最多的10个IP

awk '/29\/Sep\/2020/{ips[$1]++} END{for(i in ips){print i,ips[i]}}' text.txt | sort -k2rn | head -10

2).统计2020年9月29日一天内访问大于100次的IP

awk '/29\/Sep\/2020/{ips[$1]++} END{for(i in ips){if (ips[i]>100){print i,ips[i]} }}' text.txt