1.基础正则表达式
①grep的一些高级参数
-An:after的意思,除了列出该行外,后续的n行也列出来
-Bn:befer的意思,除了列出该行外,前面的n行也列出来
--color:颜色选项(alias grep=‘grep --color=auto’,可以直接在~/.bashrc内加入此行,“source~/.bashrc”生效)
-n:输出行号
-v:反向输出
-i:忽略大小写
②其他用法
----中括号的用法:grep -n 't[ae]st' xx.txt ;中括号内有几个字符,都只代表一个字符,表示寻找tast或者test
----寻找某个字符:grep -n 'oo' xx.txt ;xx.txt中查找含有oo的字符串
----反向选择:grep -n '[^g]oo' xx.txt ;查找不是以g开头,但第二三位是oo的字符串
grep -n '[^a-z]oo' xx.txt ;查找不是以小写字母开头,但第二三位是oo的字符串
----行首字符:grep -n '^the' xx.txt ;查找开头为the的字符串
greo -n ‘^[a-z]’xx.txt ;查找开头为小写的字符串
备注:^在[]内代表反向选择,^在[]外代表定位首字符的意义。
----结束行尾字符:grep -n '\.$' xx.txt ;查找以.结尾的行尾(.一般都有特殊意义,需要用\解除其特殊意义)
----找出空白行:grep -n '^$' xx.txt ;查找空白行
grep -nv '^$' /etc/syslog.conf | grep -v '^#'在脚本文件中,输出不含空白行,不含#注释行
----任意字符:.点代表任意字符,一个.代表一个任意字符,两个..代表两个任意字符,如:grep -n 'g..d' xx.txt 找gd之间有2个字符的字符串
----重复字符:*代表重复0个或多个*前面的字符(0个或多个),那么o*代表0个或多个o;oo*代表1个或多个o.......
grep -n 'gooo*g' xx.txt 查找g开头结尾,中间至少有二个o的字符串
grep -n '[0-9][0-9]*' xx.txt ;查找任意数字
表示0个或任意多的字符串,用 .* 表示,如需要g.....g,则可以写:‘g.*g’
----限定连续字符串:x\{m,\}y grep -n 'go\{2,\}g' xx.txt 查找含有2个以上的o的字符串,只是2个以上o,不是go
x\{m,\n}y grep -n 'go\{2,\5}g' xx.txt 查找含有2个以上5个以下o的字符串
2.sed工具
sed [-nefr] [动作([n1][,n2]动作 动作参数)] n1 n2 代表选择行进行动作
如:
①删除:nl /etc/passwd | sed '2,5d' d-删除,打印行号,并删除2-5行
nl /etc/passwd | sed '2d' 只删除第二行
nl /etc/passwd | sed '2,$d' 删除第二行到最后一行
②增加:nl /etc/passwd | sed '2a xxxxxxxxxxxxxx' 2a:在第二行下面一行增加xxxxxxxxxxx,也就是增加到第三行
i i 上面 二
增加两行:nl /etc/passwd | sed '2a xxxxxxxxxxxxx \
>yyyyyyyyyyyy' 带一个反斜杠\就可以增加2行
③替换: nl /etc/passwd | sed '2,5c NO 2-5 NUMBER' 把第二至第五行替换为NO 2-5 NUMBER
部分数据的查找并替换:sed 's/要被替换的字符串/新的字符串/g' g代表逐行
④显示: nl /etc/passwd | sed -n '5,7p' 只显示5-7行, p通常会与sed -n 一起运用,-n安静模式,不加-n会全部输出
有个实例,查找ifconfig eth0 只输出 ip字符,原 行为 :inet addr:192.168.1.200 Bcast:192.168.1.255 Mask:255.255.255.0
则:/sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | 'sed 's/Bcast.*$//g' (注意.*代表0至多个)
⑤直接修改文件内容 -i sed -i 's/要被替换的字符串/新的字符串/g'
3.awk
①格式化打印printf(类似c语言的格式输出)
printf '%10s %5i %8.2f \n' $ (cat xx.txt | grep -v Name)
s--string i---int f---float \n 分行字符
②awk:sed常用于一整行的处理,awk更倾向于把行分为数个“字段”来进行处理
如需要取得账号与登录者ip,则: last-n 5 | awk '{printf $1 "\t" $3}' $1 代表第一列 $0 代表一整行的意思 单引号内引用啥的套双引号
③awk的内置变量(引用内置变量无需加$)
----NF:每一行拥有的字段总数
----NR:目前awk所处理的是“第几行”的数据
----FS:目前的分割字符,默认是空格,可以自己设定,如:FS=":"
④awk的逻辑运算
== 等于,习惯上一个等于号=是赋值的意思
!=不等于
⑤有个问题:关于在更改默认分割字符的时候即FS=""其他的时候,第一行不生效的问题
如:cat /etc/passwd | awk '{FS=":"} $3<10 {printf $1 "\t" $3}' 显示第一列账号及第三个字段小于10的UID,
因为awk的工作流程是首先读入第一行,然后把数据填入$0,$1,$2等变量中,,这个例子在读入第一行的时候默认的分隔符还是空格,
所以第一列就无法按照需求显示,可以增加BEGIN关键字
cat /etc/passwd | awk 'BEGIN {FS=":"} $3<10 {printf $1 "\t" $3}' 那么第一行字段就能按要求显示。
4.文件比较工具
①diff diff 欲比较的文件名 目的比较的文件名
-b 忽略一行当中仅有多个空白的区别
-B 忽略空白行的区别
-i 忽略大小写的区别
②cmp 以字节为单位进行比较,diff一般以行为单位
③patch :升级
diff -Naur passwd.old passwd.new > passwd.patch 比较不同,生成.patch文件
更新:patch -pN < patch_file
还原:patch -R -pN < patch_file -p代表后面的N消除几成目录的意思
如:patch -p0 < patchwd.patch 更新成新数据
patch -R -p0 < patchwd.patch 还原成旧数据
5.文件打印准备 :pr ,如:pr /etc/man.config 可以增加时间 文件名 页码 这样的 页眉项