文本三剑客grep、awk、sed

109 阅读2分钟

一,grep

标准格式: grep 选项 匹配式/表达式 文件名/标准输入

grep选项
-i查找时忽略大小写
-n显示行号
-v反向匹配(选择除了选中单词的行)
-o只显示匹配的单词
-r递归匹配 可以跟文件夹
-R递归匹配,处理软连接
-w只匹配单词
-f以文件作为匹配条件,过滤出相同部分

示例

grep 1 a.txt 过滤出1,高亮

QQ截图20240603163241.png

grep -v 1 a.txt 反选,除了1的行,其余都过滤出

QQ截图20240603164801.png

grep -i a a.txt不区分大小写,过滤出A和a,高亮

QQ截图20240603165107.png

二,awk

  1. FS:列分割符。指定每行文本的字段分隔符,默认为空格或制表位。与"-F"作用相同
  2. NF:当前处理的行的字段个数。
  3. NR:当前处理的行的行号(序数)。
  4. $0:当前处理的行的整行内容。
  5. $n:当前处理行的第n个字段(第n列)。
  6. FILENAME:被处理的文件名。
  7. RS:行分隔符。awk从文件上读取资料时,将根据RS的定义把读取的资料切割成许多条记录,而awk一次仅读入一条记录,以进行处理。预设值是’\n’

输出所有内容

awk '{print}' name.txt 
awk '{print $0}' name.txt 

QQ截图20240603165414.png

输出第1到3行

awk 'NR==1,NR==3 {print}' name.txt	
awk '(NR>=1)&&(NR<=3) {print}' name.txt	
    

输出第1和第3行

awk 'NR==1;NR==3 {print}' name.txt	
awk 'NR==1||NR==3{print}' name.txt 

QQ截图20240603165610.png

awk '(NR%2)==1{print}' name.txt    输出所有奇数行的内容 
awk '(NR%2)==0{print}' name.txt    输出所有偶数行的内容

QQ截图20240603170123.png

从/etc/passwd文件中找到以root开头的行

awk '/^root/{print}' /etc/passwd

QQ截图20240603170255.png

三,sed

编辑文本

  • -e 以选项中的指定的script来处理输入的文本文件;
  • -f 以选项中指定的script文件来处理输入的文本文件
  • -V 或--version:显示版本信息
  • a\ 在当前行下面插入文本
  • i\ 在当前行上面插入文本
  • c\ 把选定的行改为新的文本
  • d 删除,删除选择的行
  • D 删除模板块的第一行
  • s 替换指定字符
  • g 替代当前模板块中的文本
  • G 追加到当前模板块文本的后面
  • l 列表不能打印字符的清单
  • p 打印模板块的行
  • P(大写) 打印模板块的第一行
  • = 打印当前行号码

替换 g 表示行内全面替换 p 表示打印行 w 表示把行写入一个文件

字符

  • ^ 匹配行开始,如:/^root/匹配所有以root开头的行
  • 匹配行结束,如:/root 匹配行结束,如:/root/匹配所有以root结尾的行
  • . 匹配一个非换行符的任意字符,如:/a.c/匹配a后任意一个字符
    • 匹配0个或多个字符,如:/*root/匹配root前任意个数字符
  • [.] 匹配一个指定范围内的字符,如/[Aa]bc /匹配Abc和abc
  • [^] 匹配一个不在指定范围内的字符,如:/[^B-Z]bc/匹配不包含B-Z的字母,显示结果为Abc

删除第二行

sed 2d  a.txt 

QQ截图20240603172100.png

修改aa为bb

 sed -i 's/aa/bb/g' a.txt

QQ截图20240603172637.png

在第23行添加

sed -i '2,3i aa\bb' a.txt  添加完第三行变为第四行,在原本的23行添加

微信截图_20240603175734.png