目录
- 1、三剑客介绍
- 2、三剑客之—grep
- 1. 常用参数
- 2. 常用示例
- 1.过滤以#开头的行和空白行
- 2.找出所有的mp3文件包含艺术家jayZ,不包含remix
- 3.计算匹配项的数目
- 4.在匹配字符串周围打印出行
- 5.匹配显示所有IP
- 3、三剑客之一sed
- 1.常用参数
- 2.常用示例
- 1. 奇数行后增加
- 2. 删除注释的行
- 3.插入
- 4.替换
- 4、三剑客之一awk
- 1.常用参数
- 2.常用示例
- 1.自定义输出内容
- 2.显示文件的第n行
- 3.通过管道符、双引号调用shell命令
- 4.BEGIN,END模式
1、三剑客介绍
"Shell三剑客"是指在Linux/Unix系统下使用最广泛的三个命令行工具:grep、sed和awk。它们都是文本处理工具,可以用于快速搜索、替换和处理大量文本数据。
命令 | 特点 | 使用场景 |
---|---|---|
grep | 擅长查找过滤 | 快速查找过滤 |
sed | 擅长取行和替换 | 需要快速进行替换/修改文件内容 |
awk | 擅长取列、统计计算 | 文件取列、数据切片、对比/比较和统计 |
shell三剑客通常要与正则表达式一起使用
下面是一些常用的正则表达式元字符:
.:匹配任意单个字符(除了换行符)。
*:匹配前面的字符0次或多次。
^:匹配行的开头。
$:匹配行的结尾。
[ ]:匹配方括号中的任何一个字符。例如,[abc]匹配"a"、"b"或"c"。
[^ ]:匹配不在方括号中的任何字符。例如,[^0-9]匹配任何非数字字符。
{n,m}:最少匹配n次,最多匹配m次
|:或者。匹配|前后的任意一项。
2、三剑客之—grep
1. 常用参数
-n:显示行号;
-i:忽略大小写;
-o:精准匹配;
-f:从文件每一行获取匹配模式;
-c:统计匹配的行数;
-w:匹配 整个单词;
-E:使用扩展正则表达式,相当于egrep;
-F :相当于fgrep,就是将pattern视为固定字符串。
-v:反转查找,显示不被 pattern 匹配到的行,相当于[^] 反向匹配;
-A:后面可加数字,为 after 的意思,除了列出该行外,后续的 n 行也列出来;
-B:后面可加数字,为 before 的意思,除了列出该行外,前面的 n 行也列出来;
-C:后面可加数字,为context 的意思,除了列出该行外,前后的n行也列出来。
2. 常用示例
1.过滤以#开头的行和空白行
egrep -v "^#|^$" 文本文件
2.找出所有的mp3文件包含艺术家jayZ,不包含remix
//要找出艺术家jayZ的所有mp3格式的音乐文件,里面也不要有任何混合音轨-remix
find . -name ".mp3" | grep -i JayZ | grep -vi "remix"
3.计算匹配项的数目
#类似于将grep输出的结果用管道传送给计数器(wc程序)
cat /etc/passwd| grep -c nologin
4.在匹配字符串周围打印出行
cat /etc/passwd| grep -A 2 mail #打印出前面匹配的n行
cat /etc/passwd| grep -B 2 mail #打印出后面匹配的n行
cat /etc/passwd| grep -C 2 mail #打印出两个方向都匹配的n行
5.匹配显示所有IP
ip a|egrep -o "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
3、三剑客之一sed
1.常用参数
-n:不打印模式空间;-e:执行脚本、表达式来处理;-f:执行动作从文件读取执行;-i:修改原文件;-r:使用扩展正则表达式。动作说明:
a:新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c:取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d:删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i:插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p:打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s:取代,通常这个 s 的动作可以搭配正规表示法,例如 1,20s/old/new/g 。
2.常用示例
1. 奇数行后增加
echo -e "1\n2\n3\n4\n5" | sed "1~2 a www"
#1~2奇数,1~2!偶数
2. 删除注释的行
echo -e "#todo\ndef s\nputs 'b'\nend" | sed "/^#/d"
3.插入
i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
echo -e "1\n2\n3\n4\n5" | sed "1 i aaa"
每一行插入 ‘
sed -i "s/^/\'/g" test.txt
4.替换
替换每行第一个is 为was:
sed 's/is/was/1' pets.txt
替换每行全部is为was
sed 's/is/was/g' pets.txt
替换偶数行 is为was
sed '1~2! s/is/was/g' pets.txt
覆盖原文件
sed -i '1~2! s/is/was/g' pets.txt
4、三剑客之一awk
1.常用参数
-F 指定分割字段符
-v 定义或修改一个awk内部的变量
-f 从脚本文件中读取awk命令
内建变量
FS:列分隔符。指定每行文本的字段分隔符,默认为空格或制表位,与“ -F ”作用相同OFS:输出分隔符。指定输出字段间的分隔符。RS:行分隔符。awk从文件读取资料时,将根据RS的定义把资料切割为多条记录,
awk一次仅读取一条记录,以进行处理,预设值为 \n (换行符)NF:当前处理行的字段个数NR:当前处理行的行号FNR:awk当前读取的记录数,其变量值小于等于NR
(比如当读取第二个文件时,FNR是从0开始重新计数,而NR不会)。NR==FNR:用于在读取两个或两个以上的文件时,判断是不是在读取第一个文件$0:当前处理行的整行内容$n:当前处理行的第 n 个字段(第 n 列)FILENAME:被处理的文件名
2.常用示例
1.自定义输出内容
awk,必须外层单引号,内层双引号内置变量$1、$2都不得添加双引号,否则会识别文本,尽量别添加引号awk -F: '{print "第一列",$1,"第二列",$2}' /etc/passwd
2.显示文件的第n行
#显示文件2-5行内容
awk 'NR==2,NR==5' passwd
#显示文件2-5行且输出行号
awk 'NR==2,NR==5 {print NR,$0}' passwd
#显示文件的第一列,倒数第二和倒数第三列
awk '{print $1,$(NF-1)}' test.txt
awk '{print $1,$(NF-1),$(NF-2)}' test.txt
3.结果指定分隔符
#输出第1和第3个字段,输出结果默认以 空格 分隔
awk -F ":" '{print $1,$3 }' passwd
awk -F ":" '{print $1","$3 }' passwd
awk -F ":" '{print $1"=="$3 }' passwd
3.通过管道符、双引号调用shell命令
1.统计行数
awk -F ":" '/bash$/{print}' passwd
root:x:0:0:root:/root:/bin/bash
y:x:1000:1000:y:/home/y:/bin/bash
lisi:x:1001:1001::/home/lisi:/bin/bash
#调用 wc -l 统计使用bash的行数
awk -F ":" '/bash$/{print|"wc -l"}' passwd
3
2.查看当前内存使用百分比
#查看当前内存使用百分比
free -m | awk '/Mem:/{print int($3/($3+$4)*100)"%"}'
87%
3.查看当前cpu空闲率
# -b -n 1 表示只需要1次输出结果
top -b -n 1 | grep Cpu
%Cpu(s): 2.9 us, 2.9 sy, 0.0 ni, 96.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0
#输出cpu空闲率的字段
top -b -n 1 | grep Cpu | awk -F "," '{print $4}'
96.9 id
#输出Cpu空闲率
top -b -n 1 | grep Cpu | awk -F "," '{print $4}' | awk '{print$1}'
96.9
4.BEGIN,END模式
BEGIN模式:在处理指定文本之前,需要先执行BEGIN模式中的指定的操作。
END模式:在处理指定文本结束后,需要执行END模式中的指定操作
#统计以 e 结尾的行
awk 'BEGIN{x=0}; /e$/{x++};END{print x}'
#统计以冒号分隔的文本段落数,END{}语句块中,往往会放入打印结果等语句
echo $PATH | awk 'BEGIN{RS=":"}{print NR,$0};END{print NR}'
过滤文本中重复行数
cat b.txt
aaa
bbb
ccc
aaa
aaa
aaa
bbb
bbb
ccc
#将文本的内容作为数组下标,a[$1]++表示出现相同的行,就自加1
awk '{a[$1]++}END{for (i in a){print i,a[i]}}' b.txt
aaa 4
ccc 2
bbb 3