1.grep全局搜索正则表达式
1.1 grep的格式
grep 匹配条件 处理文本
grep root filename 按指定信息匹配内容
grep ^root firename 找到文件中以root开头的行
grep root$ filename 找到文件中以root结尾的行
grep \<关键字 处理文本
grep 关键字\> 处理文本
grep \<关键字\> 处理文本
grep 参数
-a 将二进制文件以文本文件的格式去搜索
-c 记录找到搜索目标的次数
-i 忽略大小写的不同
-n 输出行号
-v 反向选择;不输出目标
-E 同时搜寻多条字符,用到扩展正则表达式时
sed -n "$=" /etc/rsyslog.conf
只显示文件一共有多少行
grep RULES /etc/rsyslog.conf -A `sed -n "$=" /etc/rsyslog.conf`
-A num 显示后面的num行
#显示该文件中匹配到的RULES后面的所有行
grep RULES /etc/rsyslog.conf -A `sed -n "$=" /etc/rsyslog.conf` | awk ‘!/^#/&&!/^$/{print $2}’ | sed ‘/^:/d;s/-//g’
/^$/ 以空格开头的行
/^:/d 删除以:开头的行
s/-//g 全局搜索-换为空
grep -nvE “root|student” /etc/passwd
grep -E “^root|bash$” passwd
匹配passwd文件中以root开头,或者bash结尾的
grep ^root passwd | grep bash$
匹配passwd文件中以root开头并且以bash结尾的
反选
1.2 grep字符的匹配次数设定
* 字符出现0-任意次
\? 字符出现0-1次
\+ 字符出现1-任意次
\{n\} 字符出现n次
\{m,n\} 至少m次,最多n次
\{0,n\} 字符出现0-n次
\{m,\} 字符出现至少m次
xy\{n\}xy **关键字**出现n次
.* 关键字之间匹配任意字符
分别为匹配 root 后面的字符 t 出现任意次,0-1次,1-任意次。(贪婪模式匹配)
分别为:
匹配关键字 root 出现任意次,0-1次,1-任意次。(贪婪模式匹配)
分别为:
匹配 root 关键字 出现 2次,0-2次,至少2次,1-3次。(贪婪模式匹配)
分别为匹配 root 后面的字符 t 出现1-3次;匹配 root 关键字出现1-3次(贪婪模式匹配);
加-E 可以使用扩展正则表达式,不需要使用转义字符。
分别为:
匹配root开头和结尾的文本
匹配root开头的文本
匹配root结尾的文本
2.sed
sed(stream editor)行编辑器
用来操作纯ASCII码的文本,处理时,把当前处理的行存储在临时缓冲区中,称为模式空间,可以指定仅仅处理哪些行;经过处理的文件都是在内存中,并没有将修改保存到源文件中。
sed符合模式条件的处理,不符合条件的不处理,处理完成之后,把缓冲区的内容送往屏幕,接着处理下一行,直到文件末尾。
sed命令调用方式:
sed 【options】 command file
sed 【options】 -f scriptfile file
sed 对字符的处理
p 显示
d 删除
a 添加
c 替换
w 写入
i 插入
P模式操作
sed -n ‘/\:/p’ fstab
sed -n '/UUID$/p' fstab
sed -n '/^UUID/p' fstab
sed -n '2,6p' fstab 打印2-6行
sed -n '2,6!p' fstab 打印不是2-6行的行
a 模式操作
sed ‘/^UUID/ahello’ fstab 以UUID开头的行下面添加一行hello
d 模式操作
sed ‘/^UUID/d’ fstab
删除fstab文件中以UUID开始的行
sed ‘1,4d’ fstab
删除1-4行
sed ‘1,4!d’ fstab
删除不是1-4行
w模式操作
把以UUID开始的行保存到/mnt/sedfile中
sed ‘/^UUID/w /mnt/sedfile’ fstab
sed '6r /mnt/sedfile' fstab
第六行写/mnt/sedfile文件的内容
sed ‘2,4w /mnt/sedfile’ fstab
2-4行写到文件/mnt/sedfile文件中
c模式操作
sed ‘/^#/chaha’ /etc/fstab
将匹配到的符合的行整行进行替换。
-i 将修改保存到源文件
在模式空间进行操作,修改的是内存缓冲区中的副本,加-i参数将修改保存到源文件。
其他用法:
- 以UUID开头的行加上行号
- G 添加空行
3.awk报告生成器
awk处理机制:awk逐行处理文本,支持在处理第一行之前做一些准备性工作,以及在处理完之后做一些总结性工作。
BEGIN{}:读入第一行文本前执行,一般用来初始化操作
{}:逐行处理,逐行读入文本执行响应的处理
END{}:处理完最后一行文本后执行,一般用来输出处理后的结果。
awk基本用法:
awk ‘{print }’ filename
awk 'BEGIN{a=0}{a++}END{print a}' filename
awk -F :'/^ro/{print}' /etc/passwd
awk '^[a-d]/{print}' /etc/passwd 打印以字母a-d开头的所有行
awk '^[^a-d]/{print}' /etc/passwd 打印不是以字母a-d开头的所有行
awk -F : '$6~/bin$/{print}' /etc/passwd 打印第六列以bin结尾的所有行
awk -F : '$6!~/bin$/{print}' /etc/passwd 打印第六列不是以bin结尾的所有行
awk -F : '$6~/bin$/{print}' /etc/passwd
awk -F : '$6~/\<bin$/{print}' /etc/passwd 防止贪婪模式
awk -F : 'BEGIN{n=1}{print n++,$1}' /etc/passwd 打印第一列的同时打印行号
awk通过 print 的功能将字段数据列出来
awk -F : '{print NR "" NF "" $1 }' passwd
-F 分隔符类型,默认为空格
NR 第几行
NF 有几列
$1 以“:”为分隔符的第一列数据
awk -F : 'BEGIN{print "NAME"}{print $1}END{print "END"}' passwd
# BEGIN {print "NAME"} 处理数据前,执行显示"NAME"字符
# END {print "END"} 处理数据后,执行显示"END"字符
统计一个文件有多少行
awk 'BEGIN{N=0}{N++}END{print N}' /etc/passwd
对指定行与内容进行显示
awk -F : '/^ro/{print}' passwd
# 以:为分隔符,显示以 ro 字符开头的行
awk -F : '/^[a-d]/{print $1,$6}' passwd
# 显示以字母 a-d 开头的行的第 1 列,第 6 列
awk -F : '/^a|nologin$/{print $1,$7}' passwd
# 显示以 a 开头,以 nologin 结尾的行的第 1 列,第 7 列
awk -F : '$6~/bin$/{print $1,$6}' passwd
# 显示从第 6 列开始,以 bin 结尾的列所在行的第 1 列,第 6 列
awk -F : '$7!~/nologin$/{print $1,$6}' passwd
# 显示除了从第 7 列开始以 nologin 结尾的行的第 1 列,第 6 列