grep awk sed 实例

来源:互联网 发布:软件认证机构 编辑:程序博客网 时间:2024/05/18 21:46
原文地址:http://blog.chinaunix.net/uid-16987232-id-3592539.html
文本过滤
5.1正则表达式
一种用来描述文本模式的特殊语法
由普通字符(例如字符a到z)已经特殊字符(称为元字符,如/、*、?等)组成。
匹配的字符串
文本过滤工具在某种模式下都支持正则表达式

5.2基本元字符集及其含义
字符                       含义
  ^               只匹配行首
  $               只匹配行尾
  *               匹配0个或多个此单字符
  []              只匹配[]内的字符。可以是一个单字符,也可以是字符序列。
               可以使用-表示[]内字符序列范围,如用[1-5]代替[12345]
  \               只用来屏蔽一个元字符的特殊含义
  .               只匹配任意单字符
pattern\{n\}      只用来匹配前面pattern出现的次数,n为次数
pattern\{n,\}     只用来匹配前面pattern出现的次数,n为次数,但次数最少为n
pattern\{n,m\}    只用来匹配前面pattern出现的次数,n为次数,但pattern出现
                    的次数在n与m之间
                    
5.3 句点"."可以匹配任意单字符
...x..x..x
drwxrwxrw-             不匹配
-rw-rw-rw-             不匹配
-rwx-wxr-x              匹配
-rwxrwxrwx              匹配

....xc....
3452xc63dd             匹配 
3452xw7134             不匹配
3452xd6126             不匹配
3452xc9871             匹配
3452xc612              不匹配

5.4^只允许在一行的开始匹配字符或单词
^
^d
drwxrwxrw-             匹配
-rw-rw-rw-             不匹配
-rwx-wxr-x             不匹配
-rwxrwxrwx             不匹配

^...1
3451xc63dd             匹配 
3452xw7134             不匹配
3452xd6126             不匹配
3451xc9871             匹配

5.5 行尾以$匹配字符串或字符
$与^相反,它在行尾匹配字符串或字符,$符号放在匹配单词后

trouble$  匹配以单词trouble结尾的所有字符
^$        匹配空行
^.$       匹配包含一个字符的行

5.6用*匹配单字符或其重复序列
10133*1

匹配
101331
10133921
10133As1

5.7用\屏蔽一个特殊字符
特殊字符
",',||,^,*,+等
\*\.pas
正则表达式中匹配以.*pas结尾的所有字符或文件

5.8用[]匹配一个范围或集合
逗号将括弧内要匹配的不同字符串分开
用“-”表示一个字符串范围,表明字符串范围从"-"左边字符开始,到"-"右边字符结束

[012345689]或[0-9]: 假定要匹配任意一个数字
[a-z]:任意小写字母
[A-Za-z]:任意大、小写字母
[A-Za-z0-9]:匹配任意字母或数字
[s,S]:匹配大、小写s

5.9 用\{\}匹配模式结果出现的次数
A\{2\}B:A出现2次,AAB
A\{4,\}B:A最少出现4次,AAAAB,AAAAAB,....
A\{2,4\}B:出现次数范围2-4次  AAB,AAAB,AAAAB
[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}:匹配IP地址


5.10 find命令
一个查找命令
查找具有某些特征文件的命令
可遍历当前目录甚至于整个文件系统来查找某些文件或目录
遍历大的文件系统时,一般放在后台执行

find命令的一般形式:
find pathname -options [-print -exec -ok]
pathname find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录
-print find命令将匹配的文件输出到标准输出
-exec find命令对匹配的文件执行该参数所给出的shell命令,相应命令的形式为
  'command'{} \;',注意{}和\;之间的空格
-ok和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell
  命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
  
5.11 find命令
find命令的一般形式:
-name 按照文件名查找文件
-perm 按照文件权限来查找文件
-user 按照文件属主来查找文件
-group 按照文件所属的组来查找文件
-mtime -n +n 按照文件的更改时间来查找文件,-n表示文件更改时间距现在n天以内。
   +n表示文件更改时间距现在n天之前,find命令还有-atime和-ctime选项,但它们
   都和-mtime选项相似
-size n[c]查找文件长度为n快的文件,带有c是表示文件长度以字节计。
-nogroup 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在
-nouser 查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在
-newer file1 !file2查找更改时间比文件file1新但比文件file2旧的文件
-type 查找某一类型的文件,诸如:
  b 块设备文件
  d 目录
  c 字符设备文件
  p 管道文件
  l 符号链接文件
  f 普通文件
  
5.12 find命令举例
使用name选项
可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来
find -name "*.txt" -print   没有写路径表示当前路径
find ./ -name "*.txt" -print
find ./ -name "[A-Z]*" -print  会查找子目录
find /etc -name "host*" -print

使用perm选项
find . -perm 755 -print

使用user和nouser选项
find `pwd` -user root -print
find `pwd` -nouser -print

使用group和nogroup选项
find ./ -group root -print
find ./ -nogroup -print

按照更改时间查找文件
find ./ -mtime -5 -print
find ./ -mtime +3 -print

查找比某个文件新或旧的文件
find `pwd` -newer "tee.txt" ! -newer "parm" -print
比tee.txt新,不parm旧的文件

使用type选项
find .. -type d -print
find .. -type l -print

使用size选项
find . -size +1000000c -print
find . -size +10 -print

使用depth选项
使用find命令时,可能希望先匹配所有的文件,再在子目录中查找
find / -name "CON.FILE" -depth -print

使用exec或ok来执行shell命令
find . -type f -exec ls -l {} \;
find . -name "*.log" -mtime +5 -ok rm{} \;  

不写路径或./或.或`pwd`都表示当前路径

Xargs
  在使用find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给
  exec,不幸的是,有些系统对能够传递给exec的命令长度有限制,只有在find命令运行几分
  钟之后,就会出现溢出错误,错误信息通常是"参数列太长"或"参数列溢出"。这就是xargs命令
  的用处所在,特别是与find命令一起使用。exec会发起多个进程,而xargs不会多个,只有一个
  find ./ -perm -7 -print |xargs chmod 0-w
  find ./ -type f -print |xargs file
  
5.13 grep介绍
grep是unix和linux中使用最广泛的命令之一
对文本文件进行模式查找
grep有三种变形
  Grep:标准grep命令
  Egrep:扩展grep,支持基本及扩展的正则表达式
  Fgrep:快速grep
grep一般格式为:
  grep[选项]基本正则表达式[文件]
  字符串参数最好采用双引号括,一是以防被误解为shell命令,二是可以用来查找多个单词组成
  的字符串

  -c只输出匹配行的基数
 -i不区分大小写(只适应于单字符)
 -h查询多文件时不显示文件名
 -H显示文件名
 -l查询多文件时只输出包含匹配字符的文件名
 -n显示匹配行及行号
 -s不显示不存在或无匹配文本的错误信息
 -v显示不包含匹配文本的所有行
 
grep "jennu" *.txt
grep "sort it" *
grep -c "OK" echo.sh
grep -i "OK" echo.sh
grep -v "OK" echo.sh
grep -v "OK[0-9]" echo.sh
grep "^[^210]" echo.sh 不是以2、1、0开头的

grep "H*P" myfile
grep "[5-8][6-9][0-3]" myfile 一个三位数 百位5-8,个位6-9,十位0-3
grep "4\{2\}" myfile   包含 44
grep "4\{2,\}" myfile  至少包含两个4
grep "4\{2,4\}" myfile 包含2到4个4
grep "^$" myfile  空行
grep "\?" myfile 包含?
grep "^d" myfile 以d开头
grep "^[^d]" myfile  不以d开头

grep命令类名
   类            等价的正则表达式
[[:upper:]]           [A-Z]
[[:alnum:]]         [0-9a-zA-Z]
[[:lower:]]           [a-z]
[[:space:]]          空格或tab键
[[:digit:]]           [0-9]
[[:alpha:]]         [a-zA-Z]

grep "5[[:degit:]][[:degit:]]" myfile

5.14 awk介绍
可从文件或字符串中基于指定规则浏览和抽取信息
是一种自解释的编程语言
三种方式调用awk
命令行方式:
  awk [-F file-spearator] 'command' input-files
awk脚本
  所有awk命令插入一个文件,并使awk程序可执行,然后用awk命令解释器作为脚本的
  首行,以便通过键入脚本名称来调用它
awk命令插入一个单独文件
  awk -f awk-script-file input_files
  
awk脚本由各种操作和模式组成
模式和动作
  模式部分决定动作语句何时触发及触发事件(BEGIN,END)
  动作对数据进行处理,放在大括号{}内知名(print)
分隔符、域和记录
  awk执行时,其浏览域标记为$1,$2...$n。这种方法称为域标识。$0为所有域
  注意执行时不要混淆符号$和shell提示符,它们是不同的
awk '{print $0}' awk.log
awk -F : '{print $1}' awk.log
awk '{print $1"\t"$2}' awk.log
awk 'BEGIN {print "IP                   Date\n----------"} {print $1"\t"$4} END {print "end-of-report"}' awk.log
begin中的是报告头,end是报告尾

awk中的特殊元字符:+?
awk匹配操作符:~,!~(~表示匹配,!~表示不匹配)
  cat awk.log | awk '$1 ~ /218.9.131.96/'  匹配218.9.131.96的所有的行
  cat awk.log | awk '$1 !~ /218.9.131.96/'  不匹配218.9.131.96的所有的行
awk '{if($1=="218.9.131.96")print $0}' awk.log

5.15 sed介绍
sed不与初始化文件打交道,它操作的只是一个拷贝,然后所有的改动没有重定向到
一个文件,将输出到屏幕
sed是一种重要的文本过滤工具,使用一行命令或者使用管道与grep与awk相结合
非交互性文本流编辑

调用sed有三种方式
使用sed命令行格式为:
  sed[选项] sed命令 输入文件
使用sed脚本文件,格式为:
  sed[选项] -f sed脚本文件 输入文件
sed脚本文件 [选项] 输入文件
  不管是使用shell命令行方式或脚本文件方式,如果没有指定输入文件,sed从标准输入
  中接受输入,一般是键盘或重定向结果
sed命令选项如下:
 n 不打印
 c 下一命令是编辑命令
 f 如果正在调用sed脚本文件

sed在文件中查询文本的方式
  使用行号,可以是一个简单数字,或是一个行号范围
  使用正则表达式
  
x                    x为一行号
x,y                  表示行号范围从x到y
/pattern/            查询包含模式的行
/pattern/pattern/    查询包含两个模式的行
pattern/,x           在给定行号上查询包含模式的行
x,/pattern/          通过行号和模式查询匹配行
x,y!                 查询不包含指定行号x和y的行

基本sed编辑命令
p       打印匹配行
=       显示文件行号
a\      在定位行号后附加新文件信息
i\      在定位行号后插入新文本信息
d       删除定位行
c\      用新文本替换定位文本
s       使用替换模式替换相应模式
r       从另一个文件中读文本
w       从文本写一个文件
q       第一个模式匹配完成后推出或立即退出
l       显示与八进制ASCII代码等价的控制字符
{}      在定位行执行命令组
n       从另一个文件中读文本下一行,并附加在下一行
g       将模式2粘贴到/pattern n
y       传送字符

sed '2p' awk.log  打印第2行的信息  会打印匹配和不匹配的行
sed -n '2p' awk.log 只打印匹配的行
sed -n '1,3p' awk.log 打印1到3行
sed -n '/url/p' awk.log 打印匹配到url的行
sed -n '14,/url/p' awk.log 从第4行开始查找,直到第一个匹配url的行(不包括第四行)
sed -n '/^$/=' awk.log 打印空行的行号
sed -n -e '/^$/p' -e '/^$/=' awk.log 打印空行及行号
sed -n '/4ddddd/a\huxiaoyi' sed.log  找到匹配的行,并替换原来的内容
sed -n '/4ddddd/i\huxiaoyi' sed.log  找到匹配的行,并替换原来的内容
sed -n '/4ddddd/c\huxiaoyi' sed.log  找到匹配的行,并替换原来的内容
sed '1,2d' sed.log  删除1,2行,但是sed.log文件中并没有真正删除掉
sed 's/chinaitlab/chinaitlab shenzhen/g' sed.log  把chinaitlab全部替换为chinaitlab shenzhen
sed -n 's/chinaitlab/&hello/p' sed.log  在chinaitlab后面追加hello
sed 'lr ctrl.txt' sed.log
sed -n '/china/l' sed.log

5.16 合并与分割
sort [options] files
许多不同的域按不同的列顺序分类
-c 测试文件是否已经分类
-m 合并两个分类文件
-u 删除所有复制行
-o 存储sort结果的输出文件名
-t 域分隔符;用非空格或tab键分隔域
+n n为域号,使用此域号开始分类
n 指定分类是域上的数字分类项
-r 比较求逆
sort -c sed.log
sort -u sed.log 合并重复行
sort -r sed.log
sort -t "/" +2 sed.log
sort -t "/" +2n sed.log

unip [option] files
从一个文本文件中去除或禁止重复行
-u 只显示不重复行
-d 只显示有重复数据行,每种重复行只显示其中一行
-c 打印每一重复行出现次数
-f n为数字,前n个域被忽略

unip -c myfile.txt
unip -d myfile.txt
unip -f 2 myfile.txt
unip -d myfile.txt

join [options] file1 file2
用来将来自两个分类文本文件的行连在一起
-an,n为一数字,用于连接时从文件n中显示不匹配行
-o n.m,连接域,n为文件号,m为域号。
-j n m,n为文件名,m为域号。使用其他域做连接域
t域分隔符。用来设置非空格或tab键的域分隔符。

join -a1 a2 address.txt town
join -o 2.2,1.1 address.txt town
join -j1 1 -j2 1 address town

split 用来将大文件分割成小文件
split命令一般格式:
split -output_file-size input_filename output_filename
-b n,每个分隔文件的大小n(k,m)
-C n,每个分隔文件一行最多n个字节
-l n,每个分隔文件的行数
-n,同-l n
split -10 ls_out.txt split

cut用来从标准输入或文本文件中剪切列或域
parte 将按行将不同文件信息放在一行