linux文本处理三剑客grep,sed,awk
grep是英语Global Regular Expression Print的首字母缩写。用于对文本内容进行过滤、抓取、分析。比如我现在工作中使用最多的就是通过grep抓取到tomcat和java的进程,以便于通过相关的进程Id关停相关的服务。
ps -ef|grep tomcat
ps -ef|grep java

可见,通过grep抓取到的tomcat相关字样被红色高亮显示。
练习:只显示/etc/passwd目录下lei用户的用户信息
grep bash /etc/passwd |grep lei

常见选项

以上截图是截取部分帮助手册(grep --help)的对grep 常见参数的解释
#匹配到3次后停止
-m, --max-count=NUM stop after NUM selected lines
grep -m 3 pattern path

#显示不被pattern匹配到的行,就是取反
-v, --invert-match select non-matching lines(反转匹配选择非匹配行)
grep -v “#” xxxx
应用:不想看/etc/fstab文本中被“#”注释掉的行


显示匹配的行号
-n, --line-number print line number with output lines

统计匹配的行数
#每个文件只打印选定行数
-c, --count print only a count of selected lines per FILE

应用:想知道当前的cpu有几核



思路:统计processor出现的次数
[root@rocky8 ~]# grep -c processor /proc/cpuinfo

仅显示匹配到的字符串
-o, --only-matching show only the part of a line matching PATTERN

静默模式,不输出任何信息。
这个模式有什么用?
他的作用是会让系统一个只发生改变
?
是
0
,还是
1
。根据
?是0,还是1。根据
?是0,还是1。根据?的值判断某个东西是否找到了(只关心找不找得到,不关心找到的是什么)
-q, --quiet, --silent suppress all normal output

-A after ,后num行
-B before, 前num行
-C context,前后各num行
-A, --after-context=NUM print NUM lines of trailing context
-B, --before-context=NUM print NUM lines of leading context
-C, --context=NUM print NUM lines of output context

应用:想找的文本本身没有什么可寻的信息,但是它周边有可用信息,比如上图的bash。通过 bash就能定位到他周边的信息。(走丢了,朋友问你在哪,你说在肯德基旁,朋友找到肯德基就找到你了。)
实现多个选项间的逻辑or关系
-e, --regexp=PATTERN use PATTERN for matching

根据模式文件处理
就相当于取两个文本内容的共有部分。
-f, --file=FILE obtain PATTERN from FILE


递归目录,但不处理软链接
-r, --recursive like --directories=recurse

递归目录,但处理软链接
-R, --dereference-recursive likewise, but follow all symlinks
. 点匹配任意单个字符(除了\n),可以是一个汉字或其他国家的文字

正则表达式需用双引号括起来
[] 匹配指定范围内的任意单个字符,例如:[lei] [0-9] [a-z] [a-zA-z]




应用: 看某个目录下的文件夹是否存在





使用正侧表达式找出ip地址
ifconfig ens160 | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' |head -n1

思路:IP地址使用点分十进制的方式表示的:10.0.0.1等,则每个数字的取值范围是0~255。个位到百位最小一个数,最大三个数则表示为:每个数字的范围是[0-9],每个数字最少匹配一次最多匹配三次则使用{m,n}。则三个数字的范围为[0-9]{1,3},最终ip地址的四个数字则匹配为:[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}


应用:排除以“#”开头的行和空行
grep -v '^\(#\|$\)' /etc/profile