Linux三剑客:grep,sed,awk

grep:搜索过滤

https://www.jianshu.com/p/cead2c420536 (简书)

grep [-acinv] [--color=auto] '[搜寻字符串]' filename
选项与参数:
-c : 计算找到 '搜寻字符串' 的次数 -i : 忽略大小写 -n : 输出行号 -v : 反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行 --color=auto : 可以将找到的关键词部分加上颜色的显示 -An : 显示匹配行和后面的n行 -Bn : 显示匹配行和前面的n行 -n : 显示匹配行和前后n行,默认0
-I : 忽略二进制文件 -r -R : 递归查找 -L : 只输出匹配到的文件,会使-n无效

不常用:
-G : 基础正则匹配 -E : 扩展正则匹配 等效 egrep -F : 匹配多字符串模式只能找固定的文本 等效 fgrep
-a : 将 binary 文件以 text 文件的方式搜寻数据
-V :版本

搜索关键词

# 将/etc/passwd 中含有 root 的行都显示出来
grep root /etc/passwd
# 将/etc/passwd,有出现 root 的行取出来,同时显示这些行在/etc/passwd的行号
grep -n root /etc/passwd
# 将/etc/passwd,将没有出现 root 的行取出来
grep -v root /etc/passwd
# 将/etc/passwd,将没有出现 root 和nologin的行取出来
grep -v root /etc/passwd | grep -v nologin
# 用 dmesg 列出核心信息,再以 grep 找出内含 eth 那行,要将捉到的关键字显色,且加上行号来表示
sudo dmesg | grep -n --color=auto 'eth'
# dmesg 列出核心信息,筛选出带有 `eth`的信息,列出 前2行(B before),后3行(A after)数据
sudo dmesg | grep -n 'eth' -A3 -B2
# dmesg 列出核心信息,筛选出带有 `eth`的信息,列出 前后5行数据
sudo dmesg | grep -5 'eth'
#过滤空行和注释并显示行号
grep -Env "^$|[#;]"

根据文件内容递归查找目录

# 递归当前目录及其子目录下搜索带有 "echo" 行的文件
grep -anrE -2 "echo" dirname
# 递归当前目录及其子目录下搜索带有 "echo" 行的文件, 但是不显示匹配的行,只显示匹配的文件
grep -aLn "echo" dirname #只显示文件
grep -anr "echo" dirname #只文件的行号

 

sed:编辑器

参考:

https://www.cnblogs.com/ginvip/p/6376049.html (博客园)

https://www.runoob.com/linux/linux-comm-sed.html (菜鸟教程)

语法:
sed [option] [-e<script>][-f<script文件>][文本文件] //选项 -n 只能打印 -e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。 -f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。 -i 编辑模式,可以直接修改文件;危险参数 //动作说明 [n|n1,n2]a\ :新增 ,a 的后面可以接字串,而这些字串会在新的一行出现,对每行起作用,默认所有行 [n|n1,n2]i\ :新增,i 的后面可以接字串,而这些字串会在新的一行出现,对每行起作用,默认所有行 [n|n1,n2]c\ :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行,对设置的行统一取代 [n|n1,n2]d :删除,d 不需要接内容 [n|n1,n2]s\/search/replace/ :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦! p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行,

实例

#sed -n 
sed -n p file #查看内容,一般和-n一起用,否则出现双份
sed -n 3p file #查看第3行的内容
sed -n 5,8p file #查看第5行到第8行的内容
sed -n 2,+5 file #查看第2行和后面5行的内容,不能-5
sed -n /search/p file #搜索内容并打印
sed -n /search1/,/search2/p file #打印从包含search1的行开始到包含search2的行结束 ,
#search1的行匹配后,search2的匹配会从下一行开始,如果没有找到匹配到最后一行,
#search都可以换位n行; #sed -e可以省掉-e ,不改变源文件 sed [n|n1,n2]a\content file #在[指定行|从n1行到n2行之间]所有行后面添加,对每行添加 sed [n|n1,n2]i\content file #在[指定行|从n1行到n2行之间]所有行前面添加,对每行添加 sed [n|n1,n2]c\content file #替换[指定行|从n1行到n2行之间]所有行的内容,不是每行替换而是全部被替换只剩一行 sed s/search/replace/ file #在[指定行|从n1行到n2行之间]所有行中搜索和替换,对每行替换 sed d file #删除[指定行|从n1行到n2行]全部行 #sed -i 编辑文件,会改变源文件 sed -i [n|n1,n2]a\content file #在[指定行|从n1行到n2行之间]所有行后面添加,对每行添加 sed -i [n|n1,n2]i\content file #在[指定行|从n1行到n2行之间]所有行前面添加,对每行添加 sed -i [n|n1,n2]c\content file #替换[指定行|从n1行到n2行之间]所有行的内容,不是每行替换而是全部被替换只剩一行 sed -i s/search/replace/ file #在[指定行|从n1行到n2行之间]所有行中搜索和替换,对每行替换 sed -i d file #删除[指定行|从n1行到n2行]全部行

#增加或修改为多行
sed a\line1\\nline2 #可以添加多行使用 \\n 分行

#注意点
1,sed不能编辑空文件;因为sed是基于流的
2,a,i,c,s后面的\可加可不加
3,多行内容 \\n

awk:格式化输出

参考:https://www.runoob.com/linux/linux-comm-awk.html (菜鸟教程)

awk可以通过 print、printf将数据输出到标准输出或重定向到文件

语法:
awk [option] 'BEGIN{ commands } { commands } END{ commands }' file
[option]
-F #设置分隔符
-v #设置变量
-f #设置awk脚本

内建变量
FS #分隔符,默认是空格,可以是任意字符或者正则表达式
OFS #输出分隔符即连接符,awk -F':' 'BEGIN{OFS="=";}{print $3,$4;}' /etc/passwd
RS #定义一行,默认一行就是一行,相当于RS='\n',结合FS,可以随意分割一个文本
ORS #输出每行分隔符,即行与行的连接符

NR #当前第几行
FNR #当前文件第几行 ,如果处理多个文件的时候,FNR表示当前文件的第几行,NR表示总第几行
NF #当前行被分割的总记录数,所以每行的最后一个可表示为$NF
FILENAME #当前输入文件的名字

//实例
# 行匹配语句 awk '' 只能用单引号 
$ awk '{print $1,$4}' log.txt#-F相当于内置变量FS, 指定分割字符为 ,
awk -F, '{print $1,$2}' log.txt 

awk -F" *" //多空格当,-F后面跟着一个以上字符时,这个字符串被当成正则表达式
awk -F' {2,}' '{print $5}' //最少2个空格

# 设置变量 
awk -va=1 '{print $1,$1+a}' log.txt 

#awk -f {awk脚本} {文件名} 
awk -f cal.awk log.txt

#模式:正则表达式:~ 表示模式开始。// 中是模式。
# 输出第二列包含 "th",并打印第二列与第四列
awk '$2 ~ /th/ {print $2,$4}' log.txt
输出包含 "re" 的行
awk '/re/ ' log.txt

#模式取反
awk '$2 !~ /th/ {print $2,$4}' log.txt
awk '!/th/ {print $2,$4}' log.txt
#忽略大小写
awk 'BEGIN{IGNORECASE=1} /this/' log.txt

#使用条件
#统计 13:3014:30 所有访问 apache 服务器的请求有多少个
awk -F "[ /:]" '$7":"$8>="13:30" && $7":"$8<="14:30"' /var/log/httpd/access_log |wc -l

#统计 13:3014:30 所有访问本机 Aapche 服务器的远程 IP 地址是什么 
awk -F "[ /:]" '$7":"$8>="13:30" && $7":"$8<="14:30"{print $1}' /var/log/httpd/access_log

实用命令收集,awk很香

#结合ps grep kill awk批量删除进程
ps aux|grep php|grep Cloud|awk '{print $2}'|xargs kill -9

 

posted @ 2020-09-16 14:21  小匡程序员  阅读(143)  评论(0编辑  收藏  举报