shell grep/sed/awk/head|tail获取指定行或指定列

shell grep/sed/awk/head|tail获取指定行或指定列
https://qnimg.ffing.cn/wp-content/uploads/2021/11/image-56.png?imageView2/0/q/75|watermark/1/image/aHR0cHM6Ly9xbmltZy5mZmluZy5jbi9mbl9sb2dvLnBuZw==/dissolve/55/gravity/SouthEast/dx/0/dy/0

譬如要打印num.txt中的第三行内容

grep:

#过滤包含字母“c”的行
cat num.txt |grep c
#grep还有个精确过滤\<\>,一般很少用到
#如包含root和roott行,只过滤root就需要grep '\< "root"\>'
cat num.txt |grep '\< "你要过滤的字段"\>'

sed:

#打印包含字母“c”的行(-n)
cat num.txt |sed -n '/c/p'
#打印包含字母“c”开头的行
cat num.txt |sed -n '/^c/p'
#打印第3行
cat num.txt |sed -n '3p'

#区间打印
#打印第1~3行和第5行
cat num.txt |sed -n '1,3p;5p'
#打印从第3行开始,再向后5行
cat num.txt |sed -n '3,+5p'
#从第3行到尾行($结尾,打印最后一行使用$p)
cat num.txt |sed -n '3,$p'
#打印字母a开头的行到字母开头c开头的行
cat num.txt |sed -n '/^a/,/^c/p'


####打印奇数行(~2代表跳2行)
#p打印
seq 10 |sed -n '1~2p'
#也可以使用d删除偶数行,来获取偶数行
seq 10 |sed -n '2~2d'
####打印偶数行(~2代表跳2行)
seq 10 |sed -n '2~2p'
#也可以使用d删除奇数行,来获取偶数行
seq 10 |sed -n '1~2d'



###sed整行替换 “c”
#cat test.log
2021-11-03	nginx  		test1	post	/admin.php
2021-11-03	15:30:30	tomcat	get	/wp-index.php
#将包含nginx整行替换为“=========”
 cat test.log|sed '/post/c ============'

awk:

#打印包含字母“c”的行
cat num.txt |awk ‘/c/’
#打印以字母“c”开头的行
cat num.txt |awk ‘/^c/’
#打印不以字母“c”开头的行(!取反)
cat num.txt |awk ‘!/^c/’
#打印第3行,通过NR==值为真的行(NR行记录)
cat num.txt |awk 'NR==3'

#区间打印
#打印1~3行和第5行
cat num.txt |awk 'NR>=1&&NR<=3;NR==5'
#打印字母a开头的行到字母开头c开头的行
cat num.txt |awk'/^a/,/^c/'


####打印奇数行(AWK中0和空值为假,非空为真)
#(第一行i=0取反就是1,有值,为真,打印;第二行,i=1,取反就是0,为假,不打印)
seq 10 | awk 'i=!i'
####打印偶数行(!取反)
seq 10 | awk '!(i=!i)'

########指定列######
###打印指定列大于或小于指定值的行(硬盘使用率使用较多!)
例:硬盘使用率大于
#df -h
devtmpfs        486M     0  486M    0% /dev
tmpfs           496M     0  496M    0% /dev/shm
tmpfs           496M  748K  495M    1% /run
tmpfs           496M     0  496M    0% /sys/fs/cgroup
/dev/vda1        20G  2.3G   17G   13% /
/dev/vda1        20G  10G    10G   50% /home
#如下,打印硬盘使用率大于20%的行
#df -h |tr -d "%"|awk '$5>20{print}'

###不打印指定列,其他列正常打印(其实也就将指定列为空)
例:排除第2、3列
#cat test.log
2021-11-03	nginx  		test1	post	/admin.php
2021-11-03	15:30:30	tomcat	get	/wp-index.php
#cat test.log|awk '{$2=$3="";print}'



head|tail

#通过head先过滤前3行,再tail显示过滤后的最后一行
cat num.txt |head -n3|tail -n1

#head正着数行号(默认10行,默认+号可以不写)
#只显示前两行+2
cat num.txt |head -n 2
#不显示后2行-2
cat num.txt |head -n -2

#tail倒着数行号(默认10行,默认减号可以不写)
#只显示最后两行-2
cat num.txt |tail -n 2
#不显示最前面2行(tail顶部多一,所以2行需要+3)
cat num.txt |tail -n +3

如需截取,可以通过awk或者cut进行获取。

#awk显示第1、2(默认以空格为分隔符)
awk '{print $1,2}'
#awk显示第1、2,以:为分隔符(-F指定分割符)
awk  -F ':' '{print $1,2}'

#cut:-d指定分隔符、-f显示列
#cut第1、2列,以:分割
cut -d ':' -f1,2
good good study, day day up!

发表评论

textsms
account_circle
email

shell grep/sed/awk/head|tail获取指定行或指定列
譬如要打印num.txt中的第三行内容 grep: #过滤包含字母“c”的行 cat num.txt |grep c #grep还有个精确过滤\<\>,一般很少用到 #如包含root和roott行,只过滤root就需要grep '\…
扫描二维码继续阅读
2021-11-14