⽂本三剑客(sed、awk、grep)⽤法
简述
awk、grep、sed是linux操作⽂本的三⼤利器,合称⽂本三剑客,三者的功能都是处理⽂本,但侧重点各不相同,其中属awk功能最强
⼤,但也最复杂。grep更适合单纯的查或匹配⽂本,sed更适合编辑匹配到的⽂本,awk更适合格式化⽂本,对⽂本进⾏较复杂格式处理。
grep
grep (Global Regular Expression Print)⽤于搜索/过滤特定字符,可以使⽤正则表达式通过返回⼀个状态值来说明,如果模板搜索成功,返回0,不成功,返回1,⽂件不存在,返回2;可以利⽤返回值进⾏⾃动化的⽂本处理⼯作。
egrep = grep -E:扩展的正则表达式(除了< , > , \b 使⽤其他正则都可以去掉\)
#输出file中含有hello字符串的⾏的数量
grep -c "hello" file
#输出file中含有hello的数量
grep -o "hello" file | wc -l
#递归查指定⽂件或⽬录中含有hello的⾏,并输出;
grep -r "hello" /etc
#查含有hello或者world的⾏;
grep -e "hello" -e "world" file
#搜索src⽬录中.c和.cpp⽂件中含有main的⾏;
grep -r "main" ./src --include *.{c,cpp}
#搜索src⽬录中含有main的⾏,但不搜索abc⽂件;
grep -r "main" ./src --exclude "abc"
#搜索src⽬录中含有main的⾏,但不搜索.git⽂件夹;
grep -r "main" ./src --exclude-dir ".git"
#删除含有hello字符串的⽂件
grep -r "hello" ./src -lZ | xargs -0 rm -f
#将file中含有root的⾏取出
grep root file
or
cat file | grep root
#将没有root的⾏取出
grep -v root /home/file
#将没有出现root和nologin的⾏取出
grep -v root /etc/passwd | grep -v nologin
#在当前⽬录查带有’hello‘⾏的⽂件
grep 'hello' *
#在当前⽬录及⼦⽬录下搜索’hello‘⾏的⽂件,但不显⽰匹配的⾏,显⽰匹配的⽂件;
grep -i -r 'hello' *
#过滤注释⾏和空⾏
grep -Ev "^$|[#;]" file1
#在⽂件'file1'⾥查"str"
grep str /home/file1
#在'home'⽬录和⼦⽬录的⽂件中查"str"
grep str -r /home/*
awk
awk是⼀种编程语⾔,⽤于在linux/unix下对⽂本和数据进⾏处理。数据可以来⾃标准输⼊(stdin)、⼀个或多个⽂件,或其它命令的输出。它⽀持⽤户⾃定义函数和动态正则表达式等先进功能,是linux/unix下的⼀个强⼤编程⼯具。它在命令⾏中使⽤,但更多是作为脚本来使⽤。awk有很多内建的功能,⽐如数组、函数等,这是它和C语⾔的相同之处,灵活性是awk最⼤的优势。
取⾏和列
#获取⽂本第1,3列的值,NF表⽰字段数,在执⾏过程中对应于当前的字段数,$为⾏尾定位符
awk '{print $1,$3}'
#取最后⼀列
awk ‘{print $NF}'
#取指定⾏,NR表⽰从awk开始执⾏后,按照记录分隔符读取的数据次数,默认的记录分隔符为换⾏符,因此默认的就是读取的数据⾏数
ps -aux|awk 'NR==3'
#输出匹配的列
docker images|awk '/d2/ {print $3}'
#取m⾏到n⾏中的k字段
awk 'NR==m,NR==n {print $k}' filename
# 取n⾏k列
awk 'NR==m {print $k}' filename
#获取内存可⽤量并且判断是否⼩于1024
FreeMem=`free -m | grep Mem | awk '{print $4}'[ $FreeMem -lt 1024 ] && echo "Insufficient Memory"
#匹配⾏⾸和⾏尾
awk '/^xxx.*?yyy/'
#统计⾏数
awk 'BEGIN { i=0 } { i++ } END { print i}' filename
or
awk 'END { print NR }' filename
#print能够接受参数;
echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1,var2,var3 ; }'  //该命令输出如下 v1 v2 v3
#awk 默认的分割符为空格和制表符,使⽤ -F 参数来指定分隔符
awk -F ':' '{print $1}' /etc/passwd
#计算剩余内存百分⽐
free -m | awk 'NR==2' | awk '{a=$2; b=$4; print b / a * 100}'
#它会在开始读取⼀个⽂件之前,运⾏⼀次 BEGIN关键字后⾯的脚本代码段,BEGIN后⾯的脚本代码段只会执⾏⼀次
awk 'BEGIN {print "Start read file"} {print $0}' /etc/passwd
#在 awk 读取并且处理完⽂件的所有内容⾏之后,才会执⾏ END 后⾯的脚本代码段
awk 'END {print "End file"}' /etc/passwd
awk 'BEGIN {print "Start read file"} {print $0} END {print "End file"}' /etc/passwd
sed
sed是⼀种流编辑器,它⼀次处理⼀⾏内容。处理时,把当前处理的⾏存储在临时缓冲区中,称为“模式空间”(patternspace ),接着⽤sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读⼊下⾏,执⾏下⼀个循环。如果没有使诸如‘D’ 的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到⽂件末尾。⽂件内容并没有改变,除⾮你使⽤重定向存储输出或-i。
功能:主要⽤来⾃动编辑⼀个或多个⽂件, 简化对⽂件的反复操作
插⼊和修改
#插⼊指定⾏的下⼀⾏
sed -i '101 a\ 1111'
#将test替换为mytest,sed 命令⼀般是写在单引号内,引号内开头的 s 表⽰替换(substitute)
sed 's/test/mytest/'  file
#在默认情况下,sed 只会替换每⾏中匹配到的第⼀个字符串,如果希望替换每⼀⾏中所有匹配到的字符串,需加在命令末尾上选项 g
sed  's/Jack/Mark/g' 
# 2~3 ⾏中的 hello 替换成 hey
sed  '2,3s/hello/hey/g' 
#在指定某⼀⾏的前⾯或者后⾯添加⼀⾏
sed -i '1i\welcome' 
#这⾥的 1 表⽰第⼀⾏, i 表⽰在这⼀⾏前⾯添加⼀⾏,如果要在第⼀⾏后⾯添加⼀⾏,则⽤字母 a :
sed -i  '1a\welcome' 
#字母 a 是 append ,在后⾯添加⼀⾏
#字母 i  是 insert,在前⾯添加⼀⾏
#在匹配⾏的前⾯或者后⾯添加⼀⾏
sed -i  '/Pony/a\welcome' 
#在后⾯添加⼀⾏⽤字母 a,在前⾯添加⼀⾏⽤字母 i
sed -i  '/Pony/i\welcome' 
#出包含字符 Pony 的那些⾏,将这些⾏中的 hello 替换成 hey
sed  '/Pony/s/hello/hey/g' 
#在1111之前添加AAA,sed -i 's/指定的字符/要插⼊的字符&/'  ⽂件
sed -i  's/1111/AAA&/' /
#在1111之后添加BBB,sed -i 's/指定的字符/&要插⼊的字符/'  ⽂件
sed -i  's/1111/&BBB/' /
#删除 2~3 ⾏,命令中的 d 表⽰删除(delete)
sed  '2,3d' 
#删除包含字符串 Pony 的⾏
正则匹配中配到到带单引号sed  '/Pony/d' 
#删除不包含字符 Pony 的⾏,这⾥的感叹号!表⽰反选,斜杠表⽰转义
sed  '/Pony/\!d' 
#删除空⽩⾏, 这⾥的 ^ 匹配⼀⾏的开头, $ 匹配⼀⾏的结尾,所以 /^$/ 就表⽰⼀⾏的开头和结尾之间没有任何内容,也就是空⽩⾏;sed  '/^$/d' 
#注意有时候有些空⽩⾏是包含空格的,这种情况就需要写成:
sed  '/^\s*$/d' 
#其中 \s 表⽰空格,星号 * 表⽰前⾯的字符重复 0 次或多次,所以这种写法可以匹配那些包含任意个空格的空⽩⾏
#删除字符“,”
echo "hello,123,word" | sed 's/,//g'

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。