原文链接找不到了,如有冒犯请及时联系我
awk用法
head -n2 test.txt|awk -F ':' '{print $1}' #以冒号为分隔符,打印第一段
head -n2 test.txt|awk -F ':' '{print $0}' #以冒号为分隔符,打印整行
awk -F ':' '{print $1"#"$2"#"$3"#"$4}' #以冒号为分隔符,打印第1、2、3、4段,中间以井号间隔
awk '/oo/' test.txt #打印包含oo的行
awk -F ':' '$1 ~/oo/' test.txt #以冒号为分隔符,打印第一列包含oo的行
awk -F ':' '/root/ {print $1,$3} /games/ {print $1,$3}' test.txt #以冒号为分隔符,打印包含root行的第一、三段,打印包含games行的第一、三段
awk -F ':' '$3=="0"' /etc/passwd #以冒号为分隔符,打印第三段是文本0的行,双引号代表字符,没有双引号代表数字
awk -F ':' '$3>="500"' /etc/passwd #以冒号为分隔符,打印第三段大于等于字符串500的行
awk -F ':' '$3>=500' /etc/passwd #以冒号为分隔符,打印第三段大于等于数字500的行
awk -F ':' '$7!="/sbin/nologin"' /etc/passwd #以冒号为分隔符,打印第七段不为/sbin/nologin的行
awk -F ':' '$3<$4' /etc/passwd #以冒号为分隔符,打印第三段小于第四段的行
awk -F ':' '$3>"5" && $3<"7"' /etc/passwd #以冒号为分隔符,打印第三段大于字符5且第三段小于字符7的行
awk -F ':' '$3>1000 || $7=="/bin/bash"' /etc/passwd #以冒号为分隔符,打印第三段大于1000或者第七段等于/bin/bash的行
head -5 /etc/passwd |awk -F ':' '{OFS="#"} {print $1,$3,$4}‘ #以冒号为分隔符,打印每行第1、3、4段,并以井号间隔
awk -F ':' '{OFS="#"} {if ($3>1000) {print $1,$2,$3,$4}}' /etc/passwd #以冒号为分隔符,如果第三段大于1000则打印第1、3、4段,并以井号间隔
head -n3 /etc/passwd | awk -F ':' '{print NF}‘ #以冒号为分隔符,逐行打印该行列数
head -n3 /etc/passwd | awk -F ':' '{print NR}‘ #以冒号为分隔符,逐行打印该行行数
awk 'NR>40' /etc/passwd #打印行数大于40的行
awk -F ':' 'NR<20 && $1 ~ /roo/' /etc/passwd #打印行数小于20并且第一段包含roo的行
head -n 3 /etc/passwd |awk -F ':' '$1="root"‘ #以冒号为分隔符,给第一段赋值root,然后打印每一行
awk -F ':' '{(tot=tot+$3)}; END {print tot}' /etc/passwd #逐行做完tot=tot+3的运算,最后打印出tot的值
awk -F ':' '{if ($1=="root") {print $0}}' /etc/passwd #如果第一段是root,打印该行
awk的方法计算小数 :awk -v a= a − v b = a -v b= a−vb=b ‘BEGIN{print a+b}’
例子: awk -v a=2566.42 -v b=509.62 ‘BEGIN{print a+b}’ -------结果为:3076.04
grep 用法
grep工具用来过滤指定字符串,把文本中包含指定字符串的行标准输出。用法:grep [-cinvABC] ‘word’ filename,参数含义:
-c 显示符合条件的行数
-i 不区分大小写
-n 显示行号
-v 取反
-r 遍历所有子目录
-A 后面跟数字,过滤出符合要求的行以及下面n行
-B 同上,过滤出符合要求的行以及上面n行
-C 同上,同时过滤出符合要求的行以及上下各n行
grep -n ‘root’ /etc/passwd #显示包含root的行,同时显示行号
grep -nv ‘nologin’ /etc/passwd #显示不包含nologin的行,同时显示行号
grep ‘[0-9]’/etc/inittab #显示包含0-9的行
grep -v ‘[0-9]’/etc/inittab #显示不包含0-9的行
grep -v ‘^#’ /etc/inittab #显示行首不是#的行
grep -v ‘^#’ /etc/inittab|grep -v ‘^$’ #显示行首不是#的行,同时不是空白行
grep ‘[a-zA-Z]’ test.txt #显示行首不是字母的行
grep ‘r.o’ test.txt #显示包含r.o的行,点表示任一字符
grep ‘oo*’ test.txt#显示包含o或多个o的行,星号与其前一个字符表示大于等于零个该字符
grep ‘.*’ test.txt #显示包含任何字符的行
grep ‘o{2}’ /etc/passwd#显示包含oo的行,花括号内数字表示前面字符的数量,
\
是脱义字符
egrep ‘o{2}’ /etc/passwd #同上
egrep ‘o+’ /etc/passwd #显示包含两个o以上的行,加号表示大于等于1个前面的字符
egrep ‘oo?’ /etc/passwd #显示包含o或oo的行,问号表示1个或0个前面的字符
egrep ‘root|nologin’ /etc/passwd #显示包含root或nologin的行,|表示或者
egrep ‘(oo){2}’ /etc/passwd #显示包含oooo的行,圆括号表示一个整体
sed用法
sed能实现grep匹配功能,不过没有颜色提示,不如grep简单好用。sed更强大的是替换功能。sed命令行格式为:sed [选项] ‘command’ 输入文本,示例sed ‘p’ test.txt,这个命令会打印(print)test.txt的内容。由于sed是流处理文本的每一行,默认会输出每一行,所以该条命令会每行显示两边。
常用选项有:
-n 只显示匹配行,在一般情况所有的 STDIN 都会输出到屏幕上,加入-n 后只打印被 sed 特殊处理的行
-r 扩展正则表达功能,没有该选项时正则表达式一些元字符要用反斜杠脱义
-e 多个动作,一个sed命令里可以有多个筛选条件,每个条件前需要加-e。筛选不是选交集,而是符合任一条件即输出
-i 直接修改文档读取的内容,不在屏幕上输出
command要用单引号引起来。常用命令有:
d 删除行
p 打印行
l 列出非打印字符
s 用一个字符串替换另一个
I 不区分大小写
command中还可以指定文本范围、正则表达匹配。指定范围一般是指定行的范围’1,5p’代表打印1-5行。正则匹配字符串要用斜杠引起来:’/root/p’表示打印包含root字符串的行。以上就是sed的命令格式和常用选项、命令,下面是配合正则表达式使用sed的例子。
正则表达
首先拷贝一份/etc/passwd作为试验例子:cp /etc/passwd test.txt。
sed -n '5p' test.txt #打印第五行
sed -n '1,5p' test.txt #打印第一行到第五行
sed -n '1,$p' test.txt #打印第一行到最后一行
sed -n '/root/p' test.txt #打印包含root字符串的行
sed -n '/^g/p' test.txt #打印以g开头的行
sed -n '/in$/p' test.txt #打印以in结尾的行
sed -n '/r..t/p' test.txt #打印包含“r..t”字符串的行,两个点表示两个任一字符
sed -n 'oo*p' test.txt #打印包含一个以上o的行,星号表示大于等于零个前字符
sed -n -e '1p' -e '/games/p' test.txt #打印第一行和包含111的行
sed '1d' test.txt #删除第一行
sed '1,3d' test.txt #删除第一到三行
sed '/oot/d' test.txt #删除包含oot字符的行
sed '1,2s/ot/to/g' test.txt #第一到第二行的ot替换为to,与vim中替换命令类似
sed 's#ot#to#g' test.txt #与上一条命令类似,可以将斜杠换为井号,也可以换为@
sed 's/[0-9]//g' test.txt #删除数字
sed 's/[a-zA-Z]//g' test.txt #删除字母
sed -r 's/(rot)(.*)(bash)/\3\2\1/' test.txt #圆括号为一个整体,替换三个括号内容的顺序,123代表三个括号
sed 's/^.*$/123&/' test.txt #在行前面加上123。也可以像上面用\1来表示前面的整体,不过要用圆括号扩起来
sed -i 's/ot/to/g' test.txt #ot替换为to,并修改文本。没有-i的话以上所有操作只是标准输出的屏幕,不会修改文本