|
第五章 文本过滤
1.正则表达式
一种用来描述文本模式的特殊语法,由普通字符以及特殊字符(元字符)组成
^ ----只匹配行首
$ ----只匹配行尾
* ----匹配0个或多个此单字符
[] ----只匹配[]内字符,可以使用-表示序列范围[1-5]
\ ----屏蔽一个元字符的特殊含义
. ----匹配任意单字符
pattern\{n\} 只用来匹配前面pattern出现的次数,n为次数
pattern\{n,\}只用来匹配前面pattern出现的次数,至少为n
pattern\{n,m\}只用来匹配前面pattern出现的次数,次数在n-m之间
eg:
A\{3\}B AAAB
A\{3,\}B AAAB AAAAB ...
A\{3,5\}B AAAB AAAAB AAAAAB
2.find命令 ----查找文件和目录
find pathname -options [-print -exec -ok]
pathname --查找的目录路径. .--表示当前目录,/表示根目录
-print 输出
-exec 对匹配的文件执行该参数所给出的shell命令,相应命令形式为'command'{} \;' 注意{}和\;之间的空格
-ok 与-exec相同,不过执行命令前会有提示
options :
-name
-perm
-user
-group
-mtime -n +n (atime,-ctime) 修改时间(访问时间,创建时间)
-size n[c]
-type 查找某一类型的文件
eg.
[test@szbirdora 1]$ find ./ -mtime +5
./helloworld.sh
./nohup.out
查看./目录(当前)下修改时间超过5天的文件
3.grep介绍
grep -c 输出匹配行计数
grep -i 不区分大小写
grep -h 查询多文件时不显示文件名
grep -H 显示文件名
grep -l 查询多文件时只输出包含匹配字符的文件名
grep -n 显示匹配行及行号
grep -s 不显示不存在或不匹配文本的错误信息
grep -v 显示不包含匹配文本的所有行(过滤文本)
eg.
[test@szbirdora 1]$ grep -n 's.a' myfile
2:/dev/sda1 20G 3.3G 16G 18% /
4:/dev/sda2 79G 18G 58G 23% /u01
5:/dev/sda4 28G 3.9G 22G 15% /u02
[test@szbirdora 1]$ grep -n '2$' myfile
5:/dev/sda4 28G 3.9G 22G 15% /u02
grep -options '正则表达式' filename
4.sed介绍
sed不与初始化文件打交道,它操作的只是一个拷贝,然后所有的改动如果没有重定向到一个文件将输出到屏幕
sed是一种重要的文本过滤工具,使用一行命令或使用管道与grep与awk相结合。
sed调用:
1.命令 sed [options] '正则表达式sedcommand' input-files
2.script :sed [options] -f sedscript input-files
sed在文本中查询文本的方式
-行号,可以是简单数字,或一个行号范围
-使用正则表达式
x ----行号
x,y ----行号范围从x到y
x,y! ---不包含行号x到y
sed命令选项:
-n 不打印
-c 下一个命令是编辑命令
-f 如果正在调用sed脚本文件
基本sed命令
p 打印匹配行
= 显示文本行号
a\ 在定位行号后附加新文本信息
i\在定位行号前插入新文本信息
d 删除定位行
c\用新文本替换定位文本
s 使用替换模式替换相应模式
r 从另一个文件中读文本
w 写文本到一个文件
q 第一个模式匹配完成后退去
l 显示与八进制ascii代码等价的控制字符
{}在定位行执行命令组
n 从一个文件中读文本下一行,并附加在下一行
g 将模式2粘贴到/pattern n/
y 传送字符
eg.
[test@szbirdora 1]$ sed -n '2p' myfile
c
打印myfile第2行
[test@szbirdora 1]$ sed -n '2,4p' myfile
c
f
b
打印第二行到第四行
[test@szbirdora 1]$ sed -n '/a/p' myfile
a
打印匹配a的行
[test@szbirdora 1]$ sed -n '2,/2/p' myfile
c
f
b
1
2
打印第二行到匹配'2'的行
s命令替换
[test@szbirdora 1]$ sed 's/b/a/p' myfile
a
a
a
c
d
e
替换b为a
多点编辑 -e
eg. (myfile包含a-e)
[test@szbirdora 1]$ sed -e '2d' -e 's/c/d/' myfile 11
a
d
d
e
sed命令r ---从文件中读取选定的行,读入输入文件中,显示在匹配的行后面
eg.
[test@szbirdora 1]$ cat 11
*******************Alaska***************
[test@szbirdora 1]$ sed '/a/r 11' myfile
a
*******************Alaska***************
b
c
d
e
写入命令:w 将输入文件中的匹配行写入到指定文件中
eg.
[test@szbirdora 1]$ cat 11
b
[test@szbirdora 1]$ sed -n '/a/w 11' myfile
[test@szbirdora 1]$ cat 11
a
追加:a 将文本追加到匹配行的后面。sed要求在a后加\,不止一行的以\连接
eg.
[test@szbirdora 1]$ sed '/b/a\****************hello*************\-------------china---------' myfile
a
b
****************hello*************-------------china---------
c
d
e
插入命令:i 将文本插入到匹配行的前面。sed要求在a后加\,不止一行的以\连接
eg.
[test@szbirdora 1]$ sed '/b/i\
> THE CHARACTER B IS BEST\
> *******************************' myfile
a
THE CHARACTER B IS BEST
*******************************
b
c
d
e
下一个:n 从一个文件中读文本下一行,并附加在下一行
退出命令 q 打印多少行后退出
eg.
[test@szbirdora 1]$ sed '3q' myfile
a alert
b best
c cook
sed script:
sed -f scriptfile myfile
5.awk介绍
awk可从文件或字符串值基于指定规则浏览和抽取信息
awk三种调用方式:
1.命令行方式
awk [-F field-sperator]'pattern{active}' input-files
awk [-F field-sperator]'command' input-files
awk脚本
所有awk命令插入一个文件,并使awk程序可执行,然后用awk命令解析器作为脚本的首行,以便通过键入脚本名称来调用。
awk命令插入一个单独文件
awk -f awk-script-file input-files
awk脚本由模式和动作组成
分隔符、域、记录
注意这里的$1,$2是域与位置变量$1,$2不一样。$0文件中的所有记录
eg:
awk '{print $0}' myfile
awk 'BEGIN {print "IP DATE ----"}{print $1"\t"$4}END{print "end-of -report"}
[test@szbirdora 1]$ df |awk '$1!~"dev"'|grep -v Filesystem
none 1992400 0 1992400 0% /dev/shm
[test@szbirdora 1]$ df |awk '{if ($1=="/dev/sda1") print $0}'
/dev/sda1 20641788 3367972 16225176 18% /
[test@szbirdora shelltest]$ cat employee
Tom Jones 4424 5/12/66 543354
Mary Adams 5346 11/4/63 28765
Sally Chang 1654 7/22/54 650000
Billy Black 1683 9/23/44 336500
[test@szbirdora shelltest]$ awk '/[Aa]dams/' employee
Mary Adams 5346 11/4/63 28765
[test@szbirdora shelltest]$ sed -n '/[Aa]dams/p' employee
Mary Adams 5346 11/4/63 28765
[test@szbirdora shelltest]$ grep '[Aa]dams' employee
Mary Adams 5346 11/4/63 28765
三种命令方式下,使用模式匹配查询
[test@szbirdora shelltest]$ awk '{print $1}' employee
Tom
Mary
Sally
Billy
打印文件第一列
[test@szbirdora shelltest]$ awk '/Sally/{print $1"\t"$2}' employee
Sally Chang
打印匹配Sally的行的第一列和第二列
[test@szbirdora shelltest]$ df |awk '$4>20884623'
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda2 82567220 17488436 60884616 23% /u01
/dev/sda4 28494620 4589172 22457992 17% /u02
打印df输出第四列大于××的行
格式输出:
打印函数—
[test@szbirdora shelltest]$ date
Mon Mar 10 15:15:47 CST 2008
[test@szbirdora shelltest]$ date |awk '{print "Month:" $2"\nYear:" $6}'
Month:Mar
Year:2008
[test@szbirdora shelltest]$ awk '/Sally/{print "\t\tHave a nice day,"$1"\t"$2}' employee
Have a nice day,Sally Chang
printf函数
[test@szbirdora shelltest]$ echo "LINUX"|awk '{printf "|%-10s|\n",$1}'
|LINUX |
[test@szbirdora shelltest]$ echo "LINUX"|awk '{printf "|%10s|\n",$1}'
| LINUX|
~匹配符
[test@szbirdora shelltest]$ awk '$1~/Tom/{print $1,$2}' employee
Tom Jones
awk 给表达式赋值
关系运算符:
< 小于
> 大于
== 等于
!= 不等于
>= 大于等于
/dev/sda1 20G 3.3G 16G 18% /
|
|
|