下面所说的是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’ 的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
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是一个报表生成器,主要用于格式化输出。格式化文本输出器。
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
想