这一章断断续续的看了2周,还看的似懂非懂。没有办法,先把笔记写出来。
第五章 文本过滤
这则表达式
find
grep
awk
sed
sort uniq join cut paste split
~~~~~~
基本元字符
^ 只匹配行首
$ 之匹配行尾
* 多个或者零个字符匹配或者重复序列
[] 只匹配[]内的字符
\ 屏蔽元字符的含义
. 匹配任意的单字符
patten \{n\} 匹配前面pattern出现的次数
匹配举例:
^$ 匹配空行
^.$ 匹配单个字符
\*.\pas 匹配以*.pas 结尾的字符,其中* . 都为特殊字符,所以用\匹配。
[0-9] 表示匹配任意一个数字
[A-Z a-z] 匹配任意大小写字母
[A-Z a-z 0-9]匹配任意字母大小写字符
[S,s] 匹配大、小写S
A\{2\}B A出现两次,AAB
A\{4,\}B A至少出现四次 AAAAB AAAAAAB AAAAAAB............
A\{2,4\}B A出现的范围在2-4次之间 AAB AAAB AAAAB
[0-9]\{3\}.[0-9]\{3\}.[0-9]\{3\}.[0-9]\{3\} 匹配ip地址
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
正则表达式的命令
find命令
ex:
find -name "*.txt" -print
find . -perm 755 -print 查找当前目录下755权限的文件打印到屏幕上
find `pwd` -user root -print 查找当前目录下user是root的文件
nohup find -nouser -print >nouser.out & 后台查找nouser文件,目录定向到nouser.out文件
find /var -mtime -5 -print 查找var目录下,5天以内的文件打印出来
find /var -mtime +3 -print 查找var目录下,3天以前的文件打印出来
find `pwd` -newer "myfile" ! -newer "myfileeee" -print
当前目录下查找比myfile文件新,比myfileeee文件旧的文件
find /etc -type l -print 查找etc目录下的链接文件
find . -size 1000000c -print
~~~~~~~~~~~~~~~~~
用exec ok 执行shell命令
find . -type f -exec ls -l {} \;
查找当前目录下f类型文件,并执行ls -l 命令详细列出文件信息( 其中{}和\之间有 空格 )
find /var/log -name "*.log" -mtime +5 -ok rm {} \;
查找/var/log目录下5天前的.log结尾文件并删除之。
exec 无法解决内存溢出的问题,xargs可以:
find ./ -perm -7 -print |xargs chmod 777
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
grep
-i 区分大小写
-v 过滤
-c 输出行号
Grep 标准的grep命令
Egrep 扩展grep命令
Fgrep 快速grep命令
ex:
grep "file" *.txt 在当前目录下的所有.txt结尾文件中搜索file字眼
grep "the" * 在当前目录下的所有文件中搜索the字眼
grep "2004:22:5[0-9]" myfile 抓取出2004:22:50到2004:22:59这之间的字段
grep "^[^201]" myfile
grep "^$" myfile 过滤出没有内容的文件 ^表示行首 $表示行尾
ls -l >lsout.txt
grep "^d" lsout.txt 过滤出行首为d的内容(即为目录)
grep "5[[digit:]][[digit:]] lsout.txt 过滤出500-599的文件内容 [[digit:]]表示0-9的数字
grep "[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}" /etc/resolv.conf
过滤出/etc/resolv.conf中的产品地址。
grep "/htm/call_info.php" myfile|wc -l
查看call_info.php页面有多少的访问量
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~
~~~~~~~~~~
awk命令
由操作和模式组成
模式决定何时触发(BEGIN,END)
动作对数据进行处理如 {print}
分隔符 域 记录 $0表示所有域,分隔符默认是空格
awk所有的模式操作都是有' '之间括起来的
ex:
[root@host ~]# awk 'BEGIN {print"that is what I am talking about\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"} {print$1"\t"$4} END {print"end-of-report"}' lsout.out |more
意思为:打印出三部分:
一,打印出"that is what I am talking about"后换行,在打印出
" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "
二,打印出lsout.out文件中的$1域 和$4域
三,打印出"end-of-report"
~~~~~~~~~~~~~~~~~~~~~~
awk中的特殊元字符
+ 表示匹配任意字符
? 表示匹配单个字符
匹配操作字符
~ 表示匹配
!~ 表示不匹配
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sed 命令
不操作原始文件,操作的只是原本文件的一个副本,如果结果没有重新定向到一个文件,则输出到屏幕。
x,y 表示行号范围从x到y
/pattern/ 查询包含模式的行
x,y! 查询不包含制定行号x和y的行
基本shell编辑命令
p 打印匹配行号
= 显示文件行号
d 删除定位行
-n 不打印没有匹配到的
= 显示文件行号
sed -n '2p' ifelif.out 打印出第二行
sed -n '1,4p' ifelif.out 打印出第一到四行
sed -n '/do/p' fori fori文件中匹配do字符的行,并打印到屏幕。
sed -n '2,/do/p' fori 中fori文件的第二行匹配,直到匹配到do字符,其间内容打印到屏幕
sed -n '/^$/=' fori fori文件中匹配出无内容的行,打印行号到屏幕
sort 合并与分割
uniq
grep "php" myfile|awk '{print $1}'|sort|uniq -c
join
split
cut
本文出自 “初出茅庐” 博客,谢绝转载!