Shell脚本(二)-初识文本处理三基友grep|sed|awk

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

猜你喜欢

转载自blog.csdn.net/xin1889/article/details/80737873