1.grep
1. grep作用
- Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
- grep家族包括grep、egrep和fgrep。
- egrep和fgrep的命令只跟grep有很小不同。
- egrep是grep的扩展,支持更多的re元字符
- fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。
- linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。
2.格式及主要参数
grep 匹配条件 处理文件 (grep --help可查看)
-c | 只输出匹配行的计数。 |
-i | 不区分大小写。 |
-h | 查询多文件时不显示文件名。 |
-l | 查询多文件时只输出包含匹配字符的文件名。 |
-n | 显示匹配行及行号。 |
-s | 不显示不存在或无匹配文本的错误信息。 |
-v | 显示不包含匹配文本的所有行。反向过滤 |
grep -数字 | ##显示过滤行以及上面几行和下面几行 |
grep -A | ##显示过滤行以及下面几行 |
grep -B | ##显示过滤行以及上面几行 |
–color=auto | 可以将找到的关键词部分加上颜色的显示。 |
pattern正则表达式主要参数:
\ | 转义符,忽略正则表达式中特殊字符的原有含义。 |
^ | 指匹配的字符串在行首 |
$ | 指匹配的字符串在行尾 |
\ < | 匹配字符之前不能有字符 |
\ > | 匹配字符之后不能有字符 |
[ ] | 单个字符,如[A]即A符合要求 。 |
[ - ] | 范围,如[A-Z],即A、B、C一直到Z都符合要求 。 |
. | 所有的单个字符。 |
* | 所有字符,长度可以为0。 |
例子:
grep root passwd #过滤root关键字
grep ^root passwd ##以root开头
grep root$ passwd ##以root结尾
grep -i root passwd ##后略大小写
grep -E "\<root" passwd ##root字符之前不能有字符
grep -E "root\>" passwd ##root字符之后不能有字符
grep -E "\<root\>" passwd ##root字符前后都不能有字符
grep root -数字 ##显示过滤行以及上面几行和下面几行
grep root -n ##显示过滤root行以及上面和下面n行
grep root -An ##显示过滤行以及下面n行
grep root -Bn ##显示过滤行以及上面n行
grep root -v ##反向过滤
^westos 以westos开头
westos$ 以westos结尾
w....s w开头s结尾中间4个任意字符
.....s s结尾前面5个任意字符
* 字符出现任意次
? 0到1次
+ 1次到任意次
{n} n次
{m,n} m到n次
{0,n} 0-n次
{,n} 0-n次
{m,} 最少m次
(lee){2} lee字符串出现2次
2.sed
命令格式:
sed 参数 命令 处理对象
sed 参数 处理对象 -f 处理规则文件
选项
-e | 直接在命令行模式上进行sed动作编辑,此为默认选项; |
-f | 将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作; |
-i | 直接修改文件内容; |
-n | 只打印模式匹配的行; |
-r | 支持扩展表达式; |
-h或–help | 显示帮助; |
-V或–version | 显示版本信息。 |
参数
文件:指定待处理的文本文件列表。
sed常用命令
p | 打印模板块的行。 P(大写) 打印模板块的第一行 ; |
a\ | 在当前行下面插入文本; |
i\ | 在当前行上面插入文本; |
c\ | 把选定的行替换为新的文本; |
d | 删除,删除选择的行; |
D | 删除模板块的第一行; |
-s | 替换指定字符; |
= | 打印当前行号; |
h | 拷贝模板块的内容到内存中的缓冲区; |
H | 追加模板块的内容到内存中的缓冲区; |
g | 获得内存缓冲区的内容,并替代当前模板块中的文本; |
G | 获得内存缓冲区的内容,并追加到当前模板块文本的后面; |
l | 列表不能打印字符的清单; |
n | 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令; |
N | 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码; |
q | 退出Sed; |
b | lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾; |
r | file 从file中读行; |
t | label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾; |
T | label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾; |
w file | 写并追加模板块到file末尾; |
W file | 写并追加模板块的第一行到file末尾; |
! | 表示后面的命令对所有没有被选定的行发生作用; |
# | 把注释扩展到下一个换行符以前; |
例如:对字符的处理
#p #显示
#sed -n 5p westos #显示第五行
#sed -n 3,5p westos #显示3到5行
#sed -ne '3p;5p' westos #显示3和5行
#sed -ne 1,5p westos #1-5行
#sed -ne '5,$p' westos #5到最后以行
#sed -n '/^#/p' fstab #显示以#开头的行
#d #删除
sed '/^$/d' file 删除空白行
#sed 5d westos #删除第五行
#sed '/^#/d' fstab #把#开头的行删除
#sed '/^UUID/!d' fstab #除了UUID以外的行都删除
#sed -e '5,$d' westos #删除5到最后以行
#a #添加
#sed -e '$a hello world' fstab#添加到最后一行的下面
sed -e '1ahello' -e '5ahello' passwd#添加到第一行和五行的下面
sed '1,5ahello' passwd #添加到password文件的第一至五行的下面
sed '/sync/ahello' passwd #添加到sync关键字的下面一行
#sed -e '/^#/a hello world' fstab##添加到以#开头的下面一行
#sed -e '$a hello\nworld' fstab
#c #替换
#sed -e '/^#/c hello world' fstab#替换以#开头的行
#sed '5chello world' westos#替换第5行
#w #把符合的行写到指定文件中
#sed '/^UUID/w westofile' westos #把westos中UUID开头的行写入westosfile中
#i #插入
#sed '5ihello westos' westos
#r #整合文件
#sed '5r haha' westos#把haha文件整合到westos文件的第五行后面
3.awk
-
awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息
-
awk处理过程: 依次对每一行进行处理,然后输出
-
awk命令形式:awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file
[-F/-f/-v] | 大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value |
- ’ ’ | 引用代码块 |
- BEGIN | 初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符 |
- // | 匹配代码块,可以是字符串或正则表达式 |
- {} | 命令代码块,包含一条或多条命令 |
- ; | 多条命令使用分号分隔 |
- END | 结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息 |
awk -F 分隔符 BEGIN{}{}END{} FILENAME
NR | 行数 |
NF | 列数 |
FILENAME | 文件名称本身 |
westos | westos变量值 |
“westos” | westos字符串,要用引号引起来 |
/bash$/ #条件
/条件1 条件2/ #条件1或者条件2
/条件1/||/条件2/ #条件1或者条件2
/条件1/&&/条件2/#条件1并且条件2
常用
$0 | 所有的列 |
`$1 | 第一列 |
FNR | 与NR类似,不过多文件记录不递增,每个文件都从1开始 |
\t | 制表符 |
\n | 换行符 |
FS | BEGIN时定义分隔符 |
RS | 输入的记录分隔符, 默认为换行符(即文本是按一行一行输入) |
~ | 匹配,与==相比不是精确比较 |
!~ | 不匹配,不精确比较 |
== | 等于,必须全部相等,精确比较 |
!= | 不等于,精确比较 |
&& | 逻辑与 |
+ | 匹配时表示1个或1个以上 |
/[0-9][0-9]+/ | 两个或两个以上数字 |
/[0-9][0-9]*/ | 一个或一个以上数字 |
FILENAME | 文件名 |
OFS | 输出字段分隔符, 默认也是空格,可以改为制表符等 |
ORS | 输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕 |
-F’[:#/]’ | 定义三个分隔符 |
[root@node2 mnt]# awk '{print NR}' passwd #显示行号
[root@node2 mnt]# awk '{print $0}' passwd #显示内容
[root@node2 mnt]# awk '{print NR $0}' passwd #显示行号和内容
[root@node2 mnt]# awk '{print NR" " $0}' passwd #$是所有行,NR是行号,空格要用引号引起来,带引号就是字符串,不引号就是变量
[root@node2 mnt]# awk '{print NF}' passwd #显示列数
[root@node2 mnt]# awk -F: '{print NF}' passwd #指定分割副为冒号