grep、sed和awk都是Linux中的文本处理工具。
grep:文本过滤器,使用特定模式匹配搜索文本,并默认输出匹配行。
sed:文本编辑器,操作纯ASCII码的文本,操作文本的时候按行进行操作,也叫行编辑器。
awk:文本报告生成器,现有的功能最强大的数据处理引擎之一。
grep
grep:Global search regular expression and print out the line全面搜索研究正则表达式并显示出来
grep的基本格式:
grep [OPTION]... PATTERN [FILE]...
grep的常用参数:
-E:支持扩展的正则表达式(egrep)
-F:不支持正则表达式(fgrep)
-n:显示行号
-c:显示匹配到的行数
-i:忽略大小写
-v:显示不匹配的行
-w:匹配整个单词(如 grep bin /etc/passwd 不会匹配到sbin)
-e:多条件,或的关系(如 -e root -e jinx 则过滤出含有root或jinx的行)
例:
常用的正则表达式
##表示匹配位置
^jinx ##以jinx开头的行
jinx$ ##以jinx结尾的行
‘j..x’ ##以j开头,x结尾的四位字符串
‘j...’ ##以j开头的四位字符串
‘...x’ ##以x结尾的四位字符串
\<jinx ##以jinx开头的单词
jinx\> ##以jinx结尾的单词
\<jinx\> ##匹配整个单词
##表示匹配字数
* ##前面的字符任意次
.* ##任意字符,任意长度
\? ##前面的字符0或1此
\+ ##前面的字符至少出现一次
\{N\} ##前面的字符出现N次
\{M,N\} ##前面的字符出现M-N次
\{0,N\} ##前面的字符出现0-N次
\{M,\} ##前面的字符
\(xy\)\{n\} ##关键字xy出现n次
sed
sed:stream editor 文本编辑器,以行为单位的文本编辑工具,可以直接修改文件
sed的基本格式:
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
sed对字符的处理操作:
g:表示全面替换
p:显示
d:删除
a:行后添加
i:行前插入
c:替换指定的行
s:替换指定字符
w:写入文件
=:显示行号
对文本的操作
##显示带:的行
[root@desktop shell]# sed -n '/\:/p' fstab ##:在linux中有特殊含义,需要使用\符进行转义
# Created by anaconda on Wed May 7 01:22:57 2014
##显示以UUID开头的行
[root@desktop shell]# sed -n '/^UUID/p' fstab
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 / xfs defaults 1 1
##显示指定的行 -e添加多个条件
[root@desktop shell]# sed -n '4,6p' fstab ##显示第四行至第六行
[root@desktop shell]# sed -n -e '4p' -e '6p' fstab ##显示第四行和第六行
[root@desktop shell]# sed '/^$/d' fstab ##不显示空白行
[root@desktop shell]# sed '/^UUID/d' fstab ##不显示UUID开始的行
[root@desktop shell]# sed '1,4d' fstab ##不显示1-4行
##指定行插入字符
[root@desktop shell]# sed '/^UUID/a \hello world\njinx' fstab ##\n换行符,插入多行字符
[root@desktop shell]# sed '/^UUID/i \hello world\njinx' fstab ##在行前插入内容
[root@desktop shell]# sed '/^UUID/c \hello world\njinx' fstab ##替换指定行
[root@desktop shell]# sed -n '/^UUID/w /tmp/fstab' fstab ##将UUID起始的行写入/tmp/fstab文件中
[root@desktop shell]# sed '/^UUID/=' /etc/fstab ##在指定行前显示行号
[root@desktop shell]# sed '6r /etc/issue' fstab ##将issue文件的内容从第六行插入
##替换指定字符
[root@desktop shell]# sed 's/^#/\//' fstab ##把行首的#换成/
[root@desktop shell]# sed 's/\:/#/g' /etc/passwd ##将:替换成#,g为全文匹配,#g为从第#个匹配处开始替换,默认只替换第一个
##其他用法
[root@desktop shell]# sed 'G' fstab ##每行之间增加一行空白行
[root@desktop shell]# sed '=' fstab | sed 'N; s/\n/ /' ##每行行首添加行号
awk
awk报告生成器,名称出自三位创建者的姓氏,现在Linux系统中常用的是gawk
[root@desktop ~]# ls -l /bin/awk
lrwxrwxrwx. 1 root root 4 May 6 2014 /bin/awk -> gawk
awk的命令格式:
awk [-f|-F|-v] 'BEGIN{}//{}END{}' FILE
-f:调用脚本
-F:指定分隔符
-v:定义变量var=val
BEGIN:读入第一行文本之前执行
//:匹配代码块,可以是字符串或正则表达式
{}:命令代码块,可以包含多条命令,多条命令使用;分号分隔
END:处理完文本最后一行之后执行
awk的处理机制:
awk会逐行处理文本,并对文本进行切片(默认分隔符使用空白字符),并在内部用一个变量引用
$0 ##代表一整行
$1 ##代表第一串字符
$2 ##代表第二串字符
$3 ##代表第三串字符
NR ##每行的行号
NF ##字段数量
awk的基本用法
[root@desktop shell]# cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
##打印文件名,文件共七行,打印出七个文件名,证明awk是逐行处理
[root@desktop shell]# awk '{print FILENAME}' passwd
passwd
passwd
passwd
passwd
passwd
passwd
passwd
##每行打印行号和列数
[root@desktop shell]# awk -F : "{print NR,NF}" passwd
1 7
2 7
3 7
4 7
5 7
6 7
7 7
##BEGIN读取文件前执行,END读取文件结束后执行
[root@desktop shell]# awk -F : 'BEGIN{print "NAME"}{print $1}END{print "END"}' passwd
NAME
root
bin
daemon
adm
lp
sync
shutdown
END
##打印以ro字符开头的行
[root@desktop shell]# awk -F : '/^ro/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
##打印以a-d字符开头的行
[root@desktop shell]# awk -F : '/^[a-d]/{print}' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
##指定分隔符,打印bash结尾的行的第一串字符
[root@desktop shell]# awk -F : '/bash$/{print $1}' passwd
root
##第六串字符以bin结尾的行,打印第一和第六串字符
[root@desktop shell]# awk -F : '$6~/bin$/{print $1,$6}' passwd
bin /bin
daemon /sbin
sync /sbin
shutdown /sbin
##第七串字符不是nologin结尾的行,打印第一和第七串字符
[root@desktop shell]# awk -F : '$7!~/nologin$/{print $1,$7}' passwd
root /bin/bash
sync /bin/sync
shutdown /sbin/shutdown
###输出eth0的IP地址:
[root@desktop shell]# ifconfig eth0 | grep 'inet\>' | awk '{print $2}'
172.25.254.143