文本三剑客之grep
grep家族总共有三个:grep、egrep、fgrep
语法
grep [option] pattern file
参数
参数 |
描述 |
-a |
不要忽略二进制的数据 |
-A <显示行数n> |
除了显示符合范本样式的那一列之外,并显示该行之后n行的内容 |
-B <显示行数n> |
除了显示符合样式的那一行之外,并显示该行之前n行的内容 |
-c |
计算符合样式的列数 |
-C <显示行数n> |
除了显示符合样式的那一行之外,并显示该行之前后n行的内容 |
-E |
将样式为扩展的正则表达式来使用,相当于egrep |
-i |
忽略大小写 |
-o |
只显示符合匹配的部分 |
-q |
不显示任何信息,在脚本中判断时使用 |
-v |
显示不包含匹配文本的所有行 |
-n |
在显示符合样式的那一行之前,标示出该行的列数编号 |
-r |
以递归的方式查找符合条件的文件 |
文本三剑客之awk
语法
awk [option] 'BEGIN{ commands } pattern { commands } END{ commands }'
第一段:开始块(可选),关键字 BEGIN 必须大写,读输入文件之前执行的代码段,只在开始时执行一次,一般是在开始块中初始化一些变量
第二段:主体块(必须),主循环执行输入文件的代码段,每输入一行都执行一次,主体之前可以使用正则表达式进行过滤行,只对符合表达式的行执行主体块。
第三段:结束块(可选),关键字END必须大写,与开始块类似
参数
参数 |
描述 |
-F |
指定文件字段分隔符,相当于内建变量FS |
-v var=value |
定义变量,一个-v只能定义一个变量 |
内建变量
参数 |
描述 |
$n |
当前记录的第n个字段,字段间由FS分隔 |
$0 |
当前输入的完成行 |
NR |
当前处理行的行号,从1开始 |
FNR |
各文件分别计数的行号 |
FILENAME |
当前文件的文件名 |
FS |
字段分隔符,将输入的每一行以FS进行分割 |
RS |
记录分隔符,将对象文件以RS划分每一行 |
OFS |
输出字段分隔符,默认值与输入字段分隔符一致 |
ORS |
输出记录分隔符(默认值是一个换行符) |
IGNORECASE |
忽略如果为真,则进行忽略大小写的匹配,可以将该参数直接定义为 |
NF |
字段的数目 |
使用正则,字符串匹配
在主体块前使用正则表达式,~
表示正则表达式开始,若不指定第几段,该~
可以省略,/ /
表示要匹配的正则表达式
1 2 3 4 5 6 7
| # 打印第一段中有v字符的行以及行号 awk '$1 ~ /v/ {print NR,$0}' test.txt # 忽略大小写进行匹配 awk 'BEGIN{ IGNORECASE=1 } /P/ {print $0}' test.txt # 反向匹配 awk '$1 !~ /p/ {print NR,$0}' test.txt awk '!/p/ {print NR,$0}' test.txt
|
条件语句与循环
if判断
1 2 3
| if ( ) {} else if () {} else {} # 判断行号是否为10, awk '{if (NR==10){print NR,$0} else {print NR,"NO"}}' test.txt
|
for循环
1
| for (i = 1; i <= 5; ++i) print i
|
while循环
1
| i=1 ; while (i < 100) {print i;++i}
|
文本三剑客之sed
参数
参数 |
描述 |
-n |
只有被sed处理过的行才会被列出来 |
-i |
直接对原文件进行修改 |
-r |
支持扩展正则表达式 |