Linux4-文本处理三驾马车:grep, sed, awk
Linux基础课程系列:
1. grep
grep:一种强大的文本搜索工具,它能使用正则表达式匹配模式搜索文本,并把匹配的行打印出来
格式:grep [options] pattern file
([]内的部分可以省略)
常见参数 | 含义 |
---|---|
-w | word 精确查找某个关键词pattern |
-c | 统计匹配成功的行的数量 |
-v | 反向选择,即输出没有没有匹配的行 |
-n | 显示匹配成功的行所在的行号 |
-r | 从目录中查找pattern |
-e | 指定多个匹配模式 |
-f | 从指定文件中读取要匹配的pattern |
-i | 忽略大小写 |
-E | 匹配正则表达式(在-E 之后,正则表达式的符号不需要加反斜杠) |
2. sed
sed:流编辑器,一般用来对文本进行增删改查(sed是以行为单位来处理的)。
用法:sed [-options] 'script' file(s)
- options
常见参数 | 含义 |
---|---|
-n | 取消默认输出,只显示经过sed处理或匹配的行(常用) |
-e | 直接在命令模式上进行sed 的动作编辑,接要执行的一个或者多个命令 |
-i | 直接修改读取的文件内容,不输出。(除非使用-i修改内容,其他时候使用sed,原文件不会发生改变。不建议随便使用-i参数) |
-
script
'script'的格式:[address][!] command
。address和!可以被省略,command不可以被省略。
常见'script' address | 含义 |
---|---|
2 | 第2 行 |
2,4 | 第2 行到第4 行 |
2,$ | 第2 行到最后一行,$ 表示最后 |
2~3 | 从第2 行开始,每隔3 行取一行 |
2,+4 | 从第2 行到2+4 行 |
/pattern/ | 匹配上pattern 的行 |
[!] 表示否定,取反(相当于grep -v)
常见'script' command | 含义 |
---|---|
a | append,在指定行的后增加一行,内容为a 的后面接的字符串(增) |
i | insert,在指定行的前增加一行,内容为i 的后面接的字符串(增) |
d | delete,删除某一行或者某几行,也可以指定删除匹配上的行(删) |
c | change,改变指定行的内容(改) |
s | 替换,使用格式为's/pattern/new/[flags]' ,把pattern替换成new,默认只替换一个,可以指定flags。flag设为g 时和vim中一样,是全局替换。设为1 是为出现第一次时进行替换。(改) |
y | 转换,实现字符一对一转换,格式'y/inchars/outchars/' 。incharts和outcharts的字符数必须一致。(改) |
p | print,把匹配或修改过的行打印出来,通常与–n参数合用(查) |
3. awk
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk。gawk 是 AWK 的 GNU 版本。
用法:awk [options] '{script}' file
。
- options
常见参数 | 含义 |
---|---|
-F | fields,设置字段(列)分隔符(默认是空白字符,也就是空格和\t都会被分隔。⚠️cut的分隔只识别\t); |
-v | var=value 定义awk程序中的一个变量及其默认值 |
- script
基础结构: ' {script} '
匹配结构: ' /pattern/{script} '
扩展结构: 'BEGIN{script} {script} END{script}'
awk 在读取一行文本时,会用预定义的字段分隔符划分每个数据字段,并分配给一个变量。
$0 代表整个文本行;
$1 代表文本行中的第1个数据字段;
……
$NF 代表文本行中的最后一个数据字段
awk 默认的字段分隔符是任意空白字符(如:空格or 制表符),也可以用-F 参数自定义分隔符
-
awk内置变量
FS :定义输入字段分隔符,Field Separator,同–F
RS :定义输入记录分隔符,Record Separator
OFS :定义输出字段分隔符,Out Field Separator
ORS :定义输出记录分隔符,Out Record Separator
NF :数据文件中的字段总数,可以简单理解为列数
NR :已处理的输入记录数,可以简单理解为行数
也可以通过-v 参数自定义变量或传递外部变量 -
awk 条件和循环语句:
if:条件判断
awk ' { if (判断条件) {yes} else {no} } '
for:循环语句
awk ' { for (循环条件) {循环语句} } ' -
awk 数学运算:
+(加),-(减), (乘),^(幂),/(除),*(平方),%(取余)
int(x) x的整数部分,取靠近零一侧的值
log(x) x的自然对数