Linux三剑客看这一篇就够了(awk、sed、grep)

sed

sed是文本处理中非常好的工具。处理时,把当前处理的行存储在临时缓冲区中,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件,可以将数据行进行替换、删除、新增、选取等特定工作,简化对文件的反复操作,编写转换程序等。

sed的命令格式:
sed [options] ‘command’ file(s)

options(常见选项)

-i :直接修改文件内容; (谨慎使用)
-n :只打印模式匹配的行;
-r :支持扩展表达式;

command(常见命令)

 a\ 在当前行下面插入文本;

 i\ 在当前行上面插入文本;

 c\ 把选定的行改为新的文本;

 d 删除,删除选择的行;
 
 s 替换指定字符;

sed替换标记

g 表示行内全面替换;

sed元字符集

 ^ 匹配行开始,如:/^sed/匹配所有以sed开头的行;
 
 $ 匹配行结束,如:/sed$/匹配所有以sed结尾的行;
 
 . 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d;
 
 * 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行;
  
 [] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed;
   
 [^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行;
  
 \(..\) 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers;
  
 & 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**;
  
 \< 匹配单词的开始,如:/\ 
 \> 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行;
 
 x\{m\} 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行;
 
 x\{m,\} 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行;
 
 x\{m,n\} 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行;

awk

常见格式:
awk [options] ‘BEGIN{ commands } pattern{ commands } END{ commands }’ filename

常见的命令参数:
-F 指定输入分隔符, 如 -F:
-v 赋值一个用户定义变量,将外部变量传递给awk 。 如 -v name=lisi
-f scripfile 从脚本文件中读取awk命令 (很少使用)

结构体用法:(单引号里面的内容)
1、首先执行 BEGIN内的语句块,只会执行一次,经常用于变量初始化。
2、从文件内容中读取一行,注意awk是以行为单位处理的,每读取一行使用 pattern{commands} 循环处理 可以理解成一个for循环,这也是最重要的部分;其中 pattern 部分就是能帮我们匹配或者过滤掉一些信息
3、最后执行 END ,也是执行一次,在所有行处理完后执行,一帮用于打印一些统计结果。

pattern常见用法:
1、/正则表达式/:使用通配符的扩展集。 例如匹配包含aaa的行, /aaa/
2、关系表达式:使用运算符进行操作,可以是字符串或数字的比较测试。 例如匹配 第二列值为aaa的行 $2==“aaa”
3、模式匹配表达式:用运算符(匹配)和!(不匹配)。

1、统计 匹配指定行指定列的数之和

[root@gitlab ~]# cat guide-table 
lisi       数学    80       
lisi       英语    100
lisi       语文    80
zhangsan   数学    90
zhangsan   英语    60
zhangsan   语文    100
wangwu     语文    90

1、求出语文成绩高于90分的人数
awk -v 'course=语文' 'BEGIN{sum=0} $2=="语文" && $3>=90 { sum++ } END{print course" 分数大于90的人数为:"sum }' guide-table

这个例子能搞懂,基本上awk没问题了
2、查找使用了/data目录的进程
lsof | awk '{ if ($9 ~ /^\/data/) { print } }' |awk '{print $2}'

3、查找ext4类型的文件系统挂载信息
df -Th | awk '{if($2=="ext4") {print $0} }'     // $0是一个特殊的变量,表示整个输入行的内容。它包含了当前处理行的所有列数据

grep

个人认为是三剑客中最简单的,所以后面更新

你可能感兴趣的:(linux,linux,chrome,运维)