按行号取行
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'