正则

正则是各种各样的特殊符号在一起形成的字符串

#Grep

eg. 首先在创建一个带有passwd文件的名叫grep的目录

grep

grep -c

grep-n

grep-i

grep-v

grep-r

grep -A2

##正则表达式

grep '[0-9]' 过滤出带数字的

grep -n '^#' inittab / grep -nv '^#' inittab 把以#开头的行以及非#开头的行列出来

grep -r 遍历所有子目录 eg. grep -r "nologin" /etc/ 在程序报错时可以过滤出nologin的行

grep '[^0-9]'

**!![^]  匹配非方括号里面的内容。就是:只要不是方括号里面的内容都打印出来。

 

^[^] 匹配非方括号里面的内容开头的所有字符。 只要不是方括号里面的内容所开头的,都打印出来。

grep 'r.o' passwd "."代表任意字符,可以匹配r开头o结尾的

grep 'o*o' *左边代表重复任意次数o,右边o 表示以o结尾(o+o的“+”也代表任意次数,但不包括0次)(o?t表示?前面任意次数的o,可以为0次)

grep ".*" 表示任意或者多个字符,空格也包括在内

grep 'o\{2\}' passwd 表示过滤出passwd中o出现两次,(数字可以表示次数或者范围 {2-3}也可)

如果觉得此中拖意符号繁琐,可以采用egrep & grep -E命令

egrep 'root|nologin' passwd/表示有root或者nologin均能匹配

常用命令 egrep -v "^#|^$" /etc/config | wc-l用来看修改后行数

 

#Sed

eg.实验操作 创建一个含有test.txt(passwd文件)的sed目录

sed跟grep比较,功能差不多,不带颜色显示,但是更强的功能在于替换

sed '/root/' test.txt(//内是需要匹配的字符)

sed '/root/'p test.txt (p是print出来)

sed -n '/root/'p test.txt表示仅仅匹配出相关行

sed -2 '2' test.txt(打印2到5行是用'2,5')

sed -n '25,$'p test.txt($表示末行,打印25到末行)

sed -e '1'p -e '/root/'p -n test.txt 多项匹配(-e)连续执行多条命令

sed如何不区分大小写打印 sed -n '/bus/'Ip test.txt

sed '1,25'd test.txt删除行 (实际上并没有删除文件,只是删除显示 sed -i '1,24'd test.txt为实际删除)

sed替换功能 sed '1,10s/root/toor/g‘ -n test.txt

*sed -r ’ro‘(ro是要加-r)

sed-r ’ro‘应用实例, 前后调换 /bin &root

head test.txt |sed -r 's/(.*)/aaa:&/' 将全部的开头文件替换成aaa(&代表前面的命令(.*))

在此命令基础上,我们可以进一步扩展,比如前一到五行行首加aaa(在s前设置范围1,5即可)

同样,如何在行尾加aaa?(&:aaa)

如何在本行的下一行添加,(第二行)sed ‘2a\XXX'

在某行前面添加行 sed '2i\xxx

'

[root@linux7-128 sed]# sed -n '/r*t/'p passwd

[root@linux7-128 sed]# sed -n '/r.t/'p passwd

[root@linux7-128 sed]# sed -n '/^t/'p passwd

+、?号需要使用脱义符

 [root@linux7-128 sed]# sed -n '/r\+t/'p passwd

[root@linux7-128 sed]# sed -n '/r\?t/'p passwd

或者使用sed –nr

 [root@linux7-128 sed]# sed -nr '/r+t/'p passwd

[root@linux7-128 sed]# sed -nr '/r?t/'p passwd

[root@linux7-128 sed]# sed -nr '/o{2}/'p passwd

[root@linux7-128 sed]# sed -nr '/root|huhu/'p passwd

#Awk工具

awk相较于gep/sed的好处在于在执行“+/?”等命令时不需要拖意

awk相比较于grep和sed多了一个功能,分段

eg. 实验环境,同理拷贝etc/passwd到awk的目录下,取名1.txt

awk -F ':' '{$1}' 1.txt 指定分隔符, 把第一段打印出来 ($0代表所有都打印)同理 也可以改成{$1,$2,$4}进行多段打印

如果上列没表明用:分隔,会默认的以特殊字符或者空格来分段

awk '/oo/' 1.txt 打印出oo行

awk -F ':' '$1 ~ /oo/' 1.txt 匹配出第一段中含有oo的

awk -F ':' '/root/ {print $1,$3} /user/ {print $1,$3,$4}' 1.txt 多项匹配(awk同时支持多个表达式一起写)

awk -F ':' '$7!="/sbin/nologin"' 1.txt 列出所有第七段不等于/sbin/nologin(!=意为不等于)

awk-F ':' '$3<$4' 1.txt

同样也可以定义为更复杂的 awk -F ':' '$3>"5" && $3<"8"' 1.txt

awk -F ':' '{OFS='#'} $3>1000 || $7 ~ /bash/ {print $1,$3,$7}' 1.txt更换分隔符显示

awk -F ':' '{print NR":" $0} ' 1.txt会按行显示

awk -F ':' '{print NF":" $0} ' 1.txt会按段显示

awk -F ':' 'NR<=10 ' 1.txt 显示小于等于10行

扩展知识点:

1. Sed 的补充用法

打印文件中特定的某行到某行之间的内容

例如:有个文件test的内容如下:

ert

fff

**

[abcfd]

123

324

444

[rty]

**

fgfgf

怎么能截取

[abcfd]

123

324

444

[rty]

这一部分出来呢?

 

答案: sed -n '/\[abcfd\]/,/\[rty\]/p' test

sed 如何转换大小写字母

& 把每个单词的第一个小写字母变大写:

sed 's/\b[a-z]/\u&/g' filename

\b为begin 意指一个单词的边缘,放在前面为第一个字母,放在后面为最后一个字母

& . 把所有小写变大写:

sed 's/[a-z]/\u&/g' filename

 

& . 大写变小写:

sed 's/[A-Z]/\l&/g' filename

sed在某一行最后添加一个数字

(在以a开头后面加数字)

sed 's/\(^a.*\)/\1 12/' test

sed -r 's/(^a.*)/& 12/' test

在每一行的行首行尾加参数

sed 's/^/#/g' filename

$ sed 's/$/ --- /g'

替换第3行,3-6行

sed "3s/my/your/g"

sed "3,6s/my/your/g" filename

只替换每一行的第一个s:

sed 's/s/S/1' (不加g全局替换就是替换第一个)

只替换每一行的第二个s:

sed 's/s/S/2'

只替换第一行的第3个以后的s

sed 's/s/S/3g'

Sed N (eg sed 'N;s/my/your/')

以为匹配出所需行以及下一行,并换成一行

A追加与I插入的用法

在第一行前追加

sed "1 i XXX“ filename

sed "$ a XXX" filename

对每一行都挺插入

sed "/my/a ----" filename

https://blog.csdn.net/offbye/article/details/48498545

2. AWK 的拓展用法

在awk中使用外部shell的变量, 要用-v进行变量转换

http://ask.apelearn.com/question/199

awk 合并一个文件 http://ask.apelearn.com/question/493

awk '{print NR,FNR}' 1.txt  2.txt //首先理解NR和FNR的不同

当NR==FNR其实就是第一个文件的内容

当NR>FNR,其实就是第二个文件的内容

把一个文件多行连接成一行 http://ask.apelearn.com/question/266

方法一:

a=`cat file`;echo $a

方法二:

awk '{printf("%s ",$0)}' file

方法三:

cat file |xargs(下图应用实例先把多行打成一行然后更改空格为+号,最后bc命令统加)

过滤两个或多个关键词 http://ask.apelearn.com/question/198

grep -E '123|abc' filename  // 找出文件(filename)中包含123或者包含abc的行

egrep '123|abc' filename    //用egrep同样可以实现

awk '/123|abc/'  filename // awk 的实现方式 (只有awk是不区分正则和扩展正则的)

 

awk用print打印单引号 http://ask.apelearn.com/question/1738

awk 'BEGIN{print "a'"'"'s"}'

awk 'BEGIN{print "a'\''s"}'

awk 'BEGIN{print "a\"s"}'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值