Linux三剑客awk sed grep

0x00 序

grep主要用于文件过滤,提取自己所需的信息
sed主要用于对文件行处理,或者是替换文件内的数据
awk主要用于对文件列处理

0x01 grep

常用的是grep或者egrep,其中egrep等于grep -E

格式:grep [-参数] 条件 文件名

常用参数:

-i: 忽略大小写
-v:显示未匹配的行,即过滤符合条件的行
-o:显示匹配的字符串
-c:统计匹配条件的行数
-E:拓展正则
-n:显示行号
--color:显示颜色
-[A/B/C] n:该行及前n行/该行及后n行/该行及前后n行

alias grep='grep --color=auto'
找出内核信息中关于网卡的信息,用于分析
dmesg | grep -n -A3 -B2 'eth'
空白行 grep -n '^$' filename

使用grep实现精确过滤

:::shell
[email protected]:~# cat grep.txt 
qwq
eqwq
gqwq qwdq
#常规用法
[email protected]:~# grep -n "^qwq$" grep.txt 
1:qwq
#正则按单词匹配
[email protected]:~# grep -n "\bqwq\b" grep.txt 
1:qwq
#扩展正则
[email protected]:~# grep -nE "\<qwq\>" grep.txt 
1:qwq
#按单词匹配
[email protected]:~# grep -nw "qwq" grep.txt 
1:qwq
[email protected]:~# grep -nw "qwq" grep.txt 
1:qwq (前提是所要搜索的字符串占据一行)

0x02 sed

Sed是Stream Editor(流编辑器)缩写,是操作、过滤和转换文本内容的强大工具。常用功能有增删改查,过滤,取行

增删改查

参数a:追加到指定行后 sed '1a 插入的内容' filename
参数i:插入到指定行前sed '1i 插入的内容' filename
参数d:删除指定行 sed 'n,md' filename
参数c:取代 sed '1c 新的内容' filename
参数p,查 sed -n '1p' filename

多行处理

n{d} 对n行操作(d)
n,m{d} 对n到m行操作,包括n,m行
n,+m{d} 对n到n+m行操作,包括n,n+m行
n~m{d} 对n,n+m,n+2m...操作
n,${d} 从n到最后一行
/xxx/{d} 对匹配xxx的行处理
/xxx/,/yyy/{d} 对匹配xxx的行到匹配yyy行的行操作
/xxx/,${d}
/xxx/,n{d} 对匹配xxx的行到第n行操作,注意:如果前n行没有匹配到xxx,sed软件会显示n行以后的匹配xxx的行,如果有。
n,/xxx/{d} 从n行匹配到xxx的行操作

demo:

:::shell
[email protected]:~# cat -n sed.txt 
 1	1 q s ccc
 2	2 w x eee
 3	55 cvv dvs vvb
[email protected]:~# sed '2a 22 22 222 222' sed.txt 
1 q s ccc
2 w x eee
22 22 222 222
55 cvv dvs vvb 
[email protected]:~# sed '2i i ii iii iiii' sed.txt 
1 q s ccc
i ii iii iiii
2 w x eee
55 cvv dvs vvb 
#有时需要添加多行,可以使用\或者\n
[email protected]:~# sed '2i i ii iii iiii\na aa aaa aaaa' sed.txt
[email protected]:~# sed '2i i ii iii iiii\
> a aa aaa aaaa' sed.txt
#删除指定行
[email protected]:~# sed '1d' sed.txt 
2 w x eee
55 cvv dvs vvb 
#打印文件内容都不包含某内容
[email protected]:~# sed '/q/d' sed.txt 
2 w x eee
55 cvv dvs vvb 

替换

sed -ri 'ns/被替换的字符串/替换的字符串/{命令}'
参数i:修改文件
参数r:使用正则
命令:常用g表示全局,若指定某行设置n的值即可 demo:

:::shell
[email protected]:~# sed '3s/55/66/g' sed.txt 
1 q s ccc
2 w x eee
66 cvv dvs vv
#分组功能(sed上限9个)
[email protected]:~# sed -r 's/([0-9]{2})/do\1/g' sed.txt 
1 q s ccc
2 w x eee
do55 cvv dvs vvb 

变量替换问题

假定有两个变量$a,$b
sed s/$a/$b/g sed.txt
之前我一直愚笨的使用sed "s/`echo $a`/`echo $b`/g" sed.txt

0x03 awk

:::shell
#提取网卡eth0的ip
1. ifconfig eth0 | sed -n "/inet /p" | awk -F ":" '{print $2}' | sed -r "s/(.*) .*/\1/g"
2. ifconfig eth0 | grep "inet " | awk '{print $2}' | awk -F ":" '{print $2}'
3. ifconfig eth0 | grep "inet " | awk -F "[ :]" '{print $13}'
4. ifconfig eth0 | awk -F "[ :]+" 'NR==2 {print $4}'
#获取连接状态数
netstat -n |awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
#统计日志中单ip访问的请求数
123.151.43.65 - - [04/Jun/2016:12:14:26 +0800] "GET / HTTP/2.0" 200 963 "https://love.ysicing.net/shell/" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36"(love.log)
awk '{++S[$1]}END{for(i in S)print S[i],i}' love.log |sort -rn -k1 | head -10

#处理以下文件内容,将域名取出并根据域名进行计数排序处理
dm.log
https://www.demo.org/index.html
http://www.demo.org/home.html
http://blog.dmeo.org/index.html
http://mp3.bddemo.com/index.html
http://www.ali.org/report.html
http://post.code.org/posts.html
1. cut -d "/" -f 3 dm.log
2. awk -F "/" '{print $3}' dm.log
3. sed -r 's/.*:\/\/(.*)\/(.*)/\1/g' dm.log
4. cat dm.log | tr "\/" "\n" | grep "\..*\."(极端做法)
去重uniq -c | sort -nr (大->小)

(总结于老男孩博客oldboy)

*****
Written by ysicing on 05 June 2016