文本三剑客

linux.jpg

文本三剑客之grep

grep家族总共有三个:grepegrepfgrep

语法

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 支持扩展正则表达式