正则


正则:
正则就是一串有规律的字符串

grep:
grep [-cinvABC] 'word' filename
-c 行数
-i 不区分大小写
- n 显示行号
-v 取反
-r 遍历文件下所有子目录
-A 后面跟数字(-A2),过滤出符合要求的行以及下面n行
-B 后面跟数字,过滤出符合要求的行以及上面n行
-C后面跟数字,过滤出符合要求的行以及上下各n行

grep/egrep实例:
grep -n 'root' /etc/passwd 查看文档并显示行号
grep -nv 'nologin' /etc/passwd 显示行号并不显示带有‘nologin’的行
grep '[0-9]' /etc/inittab 显示所有带数字的行
grep -v '[0-9]'/etc/inittab 显示所有不带数字的行
grep -v '^#' /etc/sos.conf 显示以 # 号 开头的行
grep -v '^#' /etc/sosconf |grep -v '^$' 显示不以#和$开头的行
[^a-zA-Z]/[^0-9] 里面字符的反义
grep '^[^a-zA-Z]'test.txt 显示以非a-z的字符开头的的行
grep '[^0-9]' inittab 显示非数字(非0-9的数字)
grep ‘^[^0-9]' inittab 显示以非数字开头的行
grep 'r.o'test.txt .表示任意一个字符
grep 'o*o'test.txt *表示任意次数*左边的字符
grep 'o{2}' /etc/passwd 在正则中{}表示范围,需要托意 。 显示以两个o组成的字符
egrep = grep -E
gerp 'o{2}' /etc/passwd 显示以两个o组成的字符串
egrep 'o+t' /etc/passwd 显示大于一次的o的字符组成,没有的话找t
egrep 'oo?t' /etc/passwd ?表示前面字符的次数为0或1,没有的话找t
egrep 'root|nologin' /etc/passwd |表示或者,匹配有root或nologin
egrep '(00){2}' /etc/passwd

set :
sed -n '/root/'p test.txt
sed -n '/r.t/'p test.txt
sed -n '2'p test.txt 打印第2行
sed -n '2,5'p test.txt 打印2到5行
$表示末行
sed -e '1'p -e '/bus/'p -n test.txt -e可以匹配多个,并分别打印
sed -n '/bus/'Ip test.txt 匹配bus不区分大小写,加I(大写i)
sed '1,10'd test.txt 删除1到10行
sed -i '1,25'd test.txt 删除1到25行
sed '1,10s/root/toor/g' test.txt 查找替换,可使用正则表达式
head test.txt |sed -r's//([^:]+).*)[^:]+)/3:2:1/' 每行分3段,1和3段调换顺序
head testtxt |sed 's//root/123/g' 在这里时需要托意的,不然会报错,正确写法: head testtxt |sed 's//root/123/g'
head test.txt |sed -r 's/(.*)/aaa:&/' 用&代替匹配出来的字符串,在每行行首前加 aaa:

awk工具:

针对字符或数字:

在不指定分隔符的时候,默认以空格和空白字符为分隔符
head -n2 test.txt|awk -F ':'{print $1}' 指定:为分割线符,打印第一段
head -n2 test.txt|awk -F ':'{print $0}' $0表示所有
awk -F ':'‘{print $1"#"$2"#"$3"#"$4}'分割出来用#隔开
awk -F ':'‘{print $1,$2,$3,$4}'分割打印1-4行
awk '/oo/' test.txt 打印包含oo的行
awk -F ':' '$1 ~/oo/' test.txt 匹配包含oo的字符串,以:分段,打印第一段
awk -F ':' '/root/ {print $1,$3} /test/{print$1,$3}'test.txt
以:分段。匹配包含root的字符串,打印1和3段,匹配包含test的,打印1和3段
awk -F ':''$3=="0"' /etc/passwd 打印第三段等于零的
awk -F ':''$3>="500"' /etc/passwd 打印第三段大于等于500的
awk -F ':''$3>=500' /etc/passwd 不加双引号针对数字,加了双引号针对阿斯码的
awk -F ':''$7!="/sbin/nologin"' /etc/passwd 第七段不等于这个的
,字符串要加双引号

针对字段进行比较:
awk- F 用来只限定分割时的分隔符; OFS用来指定打印时用的分隔符
NR表示行,NF表示段 (数字形式)
&&并且 , ||或许 , == 匹配 , = 赋值 , tot 求和
awk -F ':' '$3<$4' /etc/passwd 第三段小于第四段的
awk -F ':' '$3>"5" && $3<"7"' /etc/passwd 第三段大于数字5并小于数字7的
awk -F ':' '$3>1000' ||$3<"7" /etc/passwd 大于1000或者小于7

head -5 /etc/passwd |awk -F ':'{OFS="#"}{print$1,$2,$3,$4}'
awk -F ':'{OFS="#"}{if($3>1000){print$1,$2,$3,$4}}' /etc/passwd

head -n3 /etc/passwd | awk -F ';'{print NF}
head -n3 /etc/passwd | awk -F ':'{print NR}
awk 'NR>40' /etc/passwd
awk -f ';'NR<20 && $1 ~ /root|sync/'/etc/passwd 行号小于20并且第一段包含root或sync的字符
head -n 3 /etc/passwd |awk -F ':'$1="root"'
awk -F ';''{(tot=tot+$3)};END{print tot}' /etc/passwd
tot每次循环都会把第三段的值相加
awk -F ':''{if($1=="root")}{print $0}}' /etc/passwd

原文地址:https://www.cnblogs.com/herosyuan/p/9791982.html