Linux下文本处理三剑客:grep、sed 和 awk

发布时间 2023-05-25 21:20:41作者: strongmore

grep

grep 命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是 Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

grep [option] pattern file
cat a.txt | grep "hello"
grep "hello" a.txt b.txt
grep -v "hello" a.txt # 显示不被pattern匹配到的行
grep -i "hello" a.txt # 忽略大小写
grep -f a.txt a.txt # 将a.txt文件中的内容当做pattern
ps -ef | grep -v grep | grep hadoop # 过滤出hadoop进程

sed

sed 命令的作用是利用脚本来处理文本文件

sed [-hnV][-e<script>][-f<script文件>][文本文件]
  • a:新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
  • c:取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
  • d:删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
  • i:插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
  • p:打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
  • s:取代,通常这个 s 的动作可以搭配正规表示法,例如 1,20s/old/new/g 。
sed "2i\this is a new line" a.txt # 在第2行的上一行插入this is a new line
sed "2a\this is a new line" a.txt # 在第2行的下一行插入this is a new line
sed "2d" a.txt # 删除第2行
sed "/hello/c\HELLO" a.txt b.txt # 将hello替换为HELLO
sed "s/hello/HELLO/g" a.txt b.txt # 将hello替换为HELLO /g表示替换一行中的所有匹配

新增和删除不能操作多个文件,替换可以。上面的命令只是将文字处理了,并没有写入到文件中

sed -i "2i\this is a new line" a.txt # 在第2行的上一行插入this is a new line,并写入到文件中
sed "2i\this is a new line" a.txt > a.txt # 不能使用这种,会将a.txt内容置空,具体原因未知

awk

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)

原文件内容

hello world
hello world
world hello
awk '{print $1}' a.txt # 打印第1个单词 默认使用空格或tab键分割
awk -F '[ ,]' '{print $1}' a.txt # 使用空格和,分割
awk '/hello/' a.txt # 匹配包含hello的行 类似grep的功能
awk '$0 !~ /hello/' a.txt # 匹配不包含hello的行 $0表示整行
awk '{print $NF}' a.txt # NF表示最后一个单词
awk '{print FS,FILENAME}' a.txt # FS->分隔符 FILENAME->文件名
awk '{print toupper($0)}' a.txt # 转大写

注意,要使用单引号,不能使用双引号,具体原因未知。

参考

Linux 文本处理三剑客:grep、sed 和 awk