sed工具
替换指定的字符
命令格式
sed -n '/root/'p passwd 查找含有root的行
sed -n '/root/'Ip passwd 大写的i,查询出来的内容不区分大小写
sed -n '/o+t/'p passwd
sed -nr '/o+t/'p passwd
扩展正则选项 -r(类似grep -E),如果不加-r,得使用 \ 脱义
sed -n '1’p passwd 打印第一行
sed -n '1,5’p passwd 打印1到5行
sed -e '1’p -e '/root/'p -n passwd 打印第一行以或者含有字符root的行
-e表示满足其中任意一个条件的行
打印出没有的root的行,d参数
sed -i '1’d passwd 删除第一行
sed -i '/root/'d passwd 删除root相关的行
加上-i参数会从文件中删除相关的行
sed ‘1,10s/tx/xt/g’ passwd 查找替换,g参数表示范围,达到全局替换。
sed -r ‘s/(xt)(.*)(bash)/\3\2\1/’ passwd
sed 's/[a-zA-Z]// 'g passwd 打印文档并不显示文档中的字母
sed -r ‘s/(.*)/aaa:&/’ passwd 在所有的行前面加上aaa:,&号表示(.*
)
awk工具
awk -F ‘:’ ‘{print $1}’ passwd
指定分隔符:,把第一段打印出来。$0表示所有段
如果不指定分隔符,将会以空格做为分隔符
awk'{print $0}'
passwd$0
表示所有段
awk ‘/tx/’ passwd 打印符合root行
awk -F ‘:’'$1
~ /tx/’ passwd 打印第一段包含tx的行
awk -F ‘:’ ‘$1==“tx”’ passwd打印第一列为tx的行
awk -F ‘:’ ‘KaTeX parse error: Double superscript at position 257: … awk -F : ':' '̲/root/ {print `1,
$2} /user/ {print
$3,$4}' passwd 把匹配root或者user的数据打印出指定的列 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190412093826828.png) awk -F ':' '/tx|ftp/ {print
$0}' passwd 打印匹配tx或者ftp的数据 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190412093729371.png) awk -F ':' '
$3==1000 {print
$1}' passwd 打印第三段等于1000的行的第一列 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190412094102280.png) awk -F ':'
‘$3>=1001 {print $1}’passwd 打印第三段大于等于1000的行 当为"1000"时,表示为ASCII码 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190412094207875.png) awk -F ':' '
$7!="/sbin/nologin" ' passwd 打印第七段不为/sbin/nologin的行 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190412094400975.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk0NTg0Ng==,size_16,color_FFFFFF,t_70) awk -F ':' '
$3=$4' passwd 一个等号表示赋值,两个等号表示等于 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2019041209495243.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk0NTg0Ng==,size_16,color_FFFFFF,t_70) awk -F ':' '
$3>1000 || $7~ /bash' passwd 打印出第三段大于1000
$7~ /bash 表示第七段包含/bash ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190412095202705.png) head -5 /etc/passwd | awk -F ':' '{OFS="#"} {
print $1,$2`}’
指定打印的列用#号分隔
NR表示行数
NF表示段数
awk -F ‘:’ ‘NR<=10’ passwd 打印前十行
awk -F ‘:’ ‘NR<10 {print NR":"$0
}’ passwd
awk -F ‘:’ ‘NR<10 &&$1 ~ /root|nologin/ {print NR":"$0
}’ passwd
NR表示行数
NF表示段数
tail passwd | awk -F ‘:’ ‘{print$NR":"$NF
}’
NR - Number of Record - 当前处理的行是第几行(因为awk是流处理工具,一行一行处理的,所以NR在不停的自增1)
FNR - File Number of Record - 当前处理的行是当前处理文件的第几行
NF - Number of Fileds - 当前行有多少列数据(这个在每行都会根据设定的分割符重新计算,默认分割符是任意连续的多个空白符)
(NRFNR) 大致等效于 (ARGIND1) , 一般用来判断是不是在处理第一个文件。
但区别是: 前者是判断当前处理的总行数跟文件内行数相等,而这种情况一般都是在第一个文件上,而ARGIND1是参数位置第1的文件时生效。—— 但,如果前面的文件是空的,那么NRFNR就生效于第一个非空文件,而ARGIND1不会。这微妙的区别使它们可以应用于不同的需要。
awk -F ‘:’ ‘$1=“root”’ passwd
awk -F ‘:’ ‘{(tot=tot+$3)};END{print tot}’ /etc/passwd
awk -F ‘:’ '{if($1"root"){print $0}}’ passwd
课堂笔记
awk语法结构:
awk -F ‘:’ ‘BEGIN{语句}{if(条件){语句1;语句2;语句3}} END{语句}’ filename
打印某行到某行之间
sed -n '/tns/./user1/'p filename
sed转换大小写,\b[a-z] 表示一个字符组的开头,[a-z] \b表示一个字符组的结尾
\u变大写,\l变小写(小写的L)
sed 's/\b[a-z]/\u&/'g passwd
sed在某一行最后面添加数字
sed -r ‘s/(^a.)/\1 12/’ filename \1表示第一个小括号里的内容
sed -r 's/(^a.)/& 12/’ filename
打印1到100含有某个字符的行
sed -n '1,100{/abc/}'p filename
awk使用外部的shell变量
a=2; awk -F ‘:’ -v n1=$a '{print KaTeX parse error: Expected 'EOF', got '}' at position 3: n1}̲' passwd sed调用…v/“p passwd,需要用”
awk合并一个文件
把一个文件的多行变成一行
方法一:
a=cat file
;echo $a
方法二:
awk ‘{printf("%s ",$0)}’ file
方法三:
cat file |xargs
awk中gsub函数的使用
awk ‘gsub(/www/,“abc”)’ /etc/passwd // passwd文件中把所有www替换为abc
awk -F ‘:’ ‘gsub(/www/,“abc”,$1) {print $0}’ /etc/passwd // 替换$1中的www为abc
awk 截取指定多个域为一行
用awk指定分隔符把文本分为若干段。如何把相同段的内容弄到一行?
以/etc/passwd为例,该文件以":"作为分隔符,分为了7段。
for i in seq 1 7
do
awk -F ‘:’ -v a=$i ‘{printf $a " "}’ /etc/passwd
echo
done
过滤两个或多个关键词
grep -E ‘123|abc’ filename // 找出文件(filename)中包含123或者包含abc的行
egrep ‘123|abc’ filename //用egrep同样可以实现
awk ‘/123|abc/’ filename // awk 的实现方式
awk用print打印单引号
awk ‘BEGIN{print "a’"’"‘s"}’
awk ‘BEGIN{print "a’’‘s"}’
awk ‘BEGIN{print “a"s”}’