Linux三剑客(grep,awk,sed)

1.grep

定义:根据用户指定的模式(pattern)对目标文本进行过滤,显示被模式匹配到的行

命令形式

grep [OPTIONS] PATTERN[FILE...]

常用参数

  •  -v 显示不被pattern匹配到的行
  • -i   忽略字符大小写
  • -n  显示匹配的行号
  • -c  统计匹配的行数
  • -o  仅显示匹配到的字符串
  • -E  使用ERE,相当于egrep

例子

1.查找文件内容包含root的行数:grep -n root test.txt

 

2.查找文件内容不包含root的行:grep -nv root test.txt

 

3.查找后以s开头的行:grep ^s test.txt

 

4.查找以n结尾的行:grep n$ test.txt

 

 5.查询以w开头d结尾,中间的字符可有可无的字符串:grep r.*d 

 

 

2.sed

定义:sed是流编辑器,一次处理一行内容。

sed处理方式:

命令形式

sed [-hnV][-e<script>][-f<script文件>][文本文件]

  • -h                           显示帮助。
  • -n                           仅显示script处理后的结果。
  • -e<script>         以选项中指定的script来处理输入的文本文件
  • -f<script文件>        以选项中指定的script文件来处理输入的文本文件。

常用参数

  • a:新增(指令行后面)  
  • c:取代
  • d:删除
  • i: 插入,此参数会修改原文件,慎用(指令行前面) 
  • p:打印        
  • s:取代

例子

1.查看帮助

  • sed -h
  • man sed

查看技巧:按“J”键向下翻页,按“K”键向上翻页;输入“/+查找内容”,按“n”查看下一条查询内容,按“N”查看上一条查询内容。

 

2.在第四行后添加新字符串:sed '4 a new line' test.txt

修改后不会改变原文件中的内容

 

3.在第二行后加上newline:sed '2a drink tea' test.txt

修改后不会改变原文件中的内容

 

4.在第二行前加上newline:sed '2i drink tes' test.txt

修改后不会改变原文件中的内容

 

5.全局替换:sed -e 's/root/hello/g' test.txt

修改后不会改变原文件中的内容,加“g”代表全局修改,否则只修改第一个

 

6.直接修改文件内容:sed -i 's/root/hello/g' test.txt

加“-i”就是直接修改原文件,此操作需谨慎

 

 

3.awk

定义:把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行后续处理。

awk处理方式:

命令形式

awk 'pattern + action' [FILE]

  • -pattern 正则表达式
  • -action 对匹配到的内容执行的命令(默认为输出每行内容)

常用参数

  • FILENAME   awk浏览的文件名
  • BEGIN          处理文本之前要执行的操作
  • END             处理文本之后要执行的操作
  • FS                设置输入域分隔符,等价于命令行-F选项
  • NF                浏览记录的域的个数(列数)
  • NR               已读的记录数(行数)
  • OFS             输出域分隔符
  • ORS             输出记录分隔符
  • RS                控制记录分隔符
  • $0                 整条记录
  • $1                 表示当前行的第一个域......以此类推

 例子

1.搜索/etc/passwd有root关键字的所有行,并显示对应的shell:awk -F : '/root/{print $7}' /etc/passwd

以“:”为分隔符“$7”是第7个域的值 

 

2.打印/etc/passwd的第二行信息:awk -F:'NR==2{print $0}' /etc/passwd

 

3.使用begin加入标题:awk 'BEGIN {print "BEGIN", "BEGIN"}{print $1, $2}' /etc/passwd

 

 

awk -F : 'BEGIN{print "BEGIN BEGIN"}{print $1,$2}' /etc/passwd

 

4.自定义分隔符:echo "111 222|333 444|555 666"|awk 'BEGIN{RS="|"}{print $0}'

 

posted @ 2020-11-25 08:54  SpongeD  阅读(198)  评论(0编辑  收藏  举报