在Linux系统中,grep、sed 和 awk 被统称为“三剑客”,它们是处理文本和数据的强大工具。这些命令与正则表达式紧密结合,提供了丰富的文本处理功能,下面列举在数据处理及核验当中常见场景进行介绍和演示。
grep
grep 命令是一个强大的文本搜索工具,用于搜索文件中匹配特定模式的行。grep全称是 Global Regular Expression Print,表示全局正则表达式版本,它支持正则表达式,可以递归地搜索目录,并且有多种选项来控制输出和搜索行为。
使用方法:
grep [args] content filename
一些常用参数:
-i : 查找时忽略大小写
-v: 反转查找,输出与模式不相符的行
-n : 显示符合模式要求的行号
-r : 递归搜索所有文件
-o : 只显示匹配的内容
-E 或 --extended-regexp : 将样式为延伸的正则表达式来使用。
示例:
假设有一个文本文件:test.txt,内容如下:
a b c d e
1 2 3 4 5
G E d C T G B
l k j h g f
1)执行命令 grep:
grep c test.txt
返回结果:a b c d e
(c 颜色高亮)
2)执行命令 grep -i:
grep -i c test.txt
返回结果:
a b c d e
G E d C T G B
(c 和 C 颜色高亮)
3)执行命令 grep -io:
grep -io c test.txt
返回结果:
c
C
(c 和 C 颜色高亮)
4)grep or 操作实现匹配多个值
4.1)grep -E
匹配"c" 或 “h” 所在行
执行命令:
grep -E 'c|h' test.txt
返回结果:
a b c d e
l k j h g f
(c 和 h 颜色高亮)
4.2)| 转义
执行命令:
grep 'c\|h' test.txt
返回结果:
a b c d e
l k j h g f
(c 和 h 颜色高亮)
sed
sed(stream editor) 是一种流编辑器,用于对文本进行过滤和转换,它可以执行基本的文本替换、删除、插入等操作。sed 通常在命令行中使用,并且可以处理来自文件或标准输入的数据流。
1)批量修改文件中的内容
sed 's/old/new/g' file 会将文件中的所有"old"替换为"new"。
它一次处理一行内容。会出数替换后的结果,但是文件内容并没有改变,除非你使用重定向存储输出或-i。如下:
sed -i 's/原字符串/替换字符串/g' filename
-i:直接修改文件中的内容,并且不在屏幕上输出。不加 -i 不会修改文件中的内容且会将执行结果输出在屏幕上;
s 命令用于替换;
命令末端的 g 表示在行内全局替换;
也就是说如果每一行里出现多个“原字符串”,所有的 “原字符串”都会被替换为 “替换字符串”。
如果没有 g 命令,则只将每一行的第一个“原字符串”替换为 “替换字符串”。
2)查看文件行数
假设有一份文件filename.txt ,内容为:
hello(\n)
linux(\n)
java
(\n) 标注代表换行符。
一般常用的查看文件行数是wc -l
wc -l filename.txt
返回结果为: 2
如果我们按实际内容统计期望是返回3行记录,但 wc 命令统计行数时,它依据的是换行符(通常是 \n ),按所示例内容只有两个换行符。
当我们想要统计出实际有多少行内容时,可以采用示例命令:
sed -n "$=" filename
返回结果: 3
-n:抑制默认输出,即不打印每一行;;$表示最后一行;= 是一个打印行号的命令。所以 $= 的意思是打印最后一行的行号。
awk
awk是一个强大的文本处理工具,特别适合处理列数据。它可以用来提取、处理和打印数据列,并且支持复杂的模式匹配和动作执行。awk有自己的编程语言,可以进行条件判断、循环等操作。
数据文件常见场景及操作命令:
1)查看字段(列)数:
awk -F '\\|\\@\\|' 'END{print NF}'
在 awk 命令中,-F 选项用于指定输入字段的分隔符,分隔符是 |@|(其中用了反斜杠 \ 进行转义) ,在在处理完所有输入行之后(END),打印出当前记录的字段数(NF)
这个命令会打印出最后一行内容的字段数(列数)。
2)查看数据文件内容的某个字段的值
2.1)查看分隔符为|@|的数据文件的第一列:
awk -F '\\|\\@\\|' '{print $1}' filename
2.2)查看分隔符为|@|的数据文件的第一列和第三列:
awk -F '\\|\\@\\|' '{print $1,$3}' filename
2.3)返回分隔符为|@|的数据文件第6列值为 ’ money’ 的数据
可以与其他命令组合获得期望的效果。
awk -F '\\|\\@\\|' '{print $6}' filename | grep money
小结
这三个工具在Linux文本处理中非常重要,在日常的数据文件处理和验证中,合理且灵活的使用它们,可以让我们的对数据的处理及核验效率更高,大大提高工作效率。它们的功能虽然强大,但通常只需要掌握它们各自擅长的领域即可:grep 擅长查找,sed 擅长编辑,awk 擅长报告生成。
