shell字符串操作(二)——常用命令grep/awk/sed

按行号取行

head -1	                                #取得第1行
head -3	                                #取得前3行
tail -1	                                #取得最后1行
sed -n '2p'	                            #取得第2行
sed -n '2,5p'	                        #取得第2至5行
awk 'NR==2{print $0}'	                #取得第2行
awk '{if(NR==3 || NR==5){print $0}}'    #取得第3、第5行
grep -A 2                               #显示匹配到的行,及其后2行的内容
grep -B 2                               #显示匹配到的行,及前2行的内容
grep -C 2                               #显示匹配到的行,及其前后2行的内容

多字符串匹配行(与、或)

#与匹配:匹配ABC 和 123:
sed -n '/ABC/{/123/p}'
awk '/ABC/&&/123/{ print $0 }'
grep -E '(ABC.*123|123.*ABC)'

#或匹配:匹配ABC 或 123:
sed -n '/\(ABC\|123\)/p'
awk '/ABC/||/123/{ print $0 }'
grep -E '(ABC|123)' 或 egrep 'ABC|123'

截取字符串(取列)

awk '{print $2}'                      #以 空格 为分割符取第2个
awk '{print $NF}'                     #以 空格 为分割符取最后1个
awk '{print $(NF-1)}'                 #以 空格 为分割符取倒数第2个
awk -F':' '{print $2}'                #以 冒号 为分割符取第2个
awk -F'[[:space:]:]' '{print $2}'     #以 空格或冒号 为分割符取第2个
#示例展示:上例中每个分割符均有效,连续空格或冒号会被分出空段)
awk -F'[[:space:]:]+' '{print $2}'    #以 空格或冒号 为分割符取第2个
#示例展示:有加号连续空格与冒号会被视为一个分割符
cut -f 3 -d" " 取第3个(以空格为分割符)
cut -f -4 -d"." 取前4段(以点号为分割符)
#示例展示:192.168.169.2(带分割符)
#echo '192.168.169.2.52918|cut -f -4 -d"."
cut -c 2-3 取第2-3个字符
cut -c -2 取前2个字符
cut -c 2- 取从第2个开始到结尾的字符

字符串匹配取得匹配的词

#在grep中使用参数-E等同于egrep,可使用正则表达式,参数-o只输出匹配的项
#示例:取得默认网关的网卡名称
ip route|grep default|grep -E -o enp.s0     #得到类似enp1s0,enp2s0…… 
#示例:取得网卡MAC地址
ip addr show enp2s0|grep -E -o \(.{2}:\){5}.{2}
#用sed有很大的局限性,原理是匹配整行(必须匹配整行),再替换成引用项(\1-\9)
echo "123hello123"|sed -r "s/[0-9]*([a-z]*).*/\1/"     #hello
#用sed不加参数 -r 时,(){}等符号需转义
echo "123hello123"|sed "s/[0-9]*\([a-z]*\).*/\1/"      #hello

关键字旁边的字串

#示例:取得默认网关所对应的网卡设备
#通过ip route|grep default取得默认网关所在的行,然后匹配这一行,dev是关键词,后面所需项在两个空格之间,最后还得用.*匹配后面的内容
ip route|grep default|sed -r 's/.*dev (\w*) .*/\1/'
#也可以不用grep,sed中用defualt匹配所需的行,再用-n p只输出匹配的行
ip route|sed -r -n '/default/s/.*dev (\w*) .*/\1/p'

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值