Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1467002
  • 博文数量: 842
  • 博客积分: 12411
  • 博客等级: 上将
  • 技术积分: 5772
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-14 14:43
文章分类

全部博文(842)

文章存档

2013年(157)

2012年(685)

分类: LINUX

2012-05-16 16:03:02

Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternetExplorer4 st1\:*{behavior:url(#ieooui) } /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman","serif";}

awk的环境变量

变量

描述

$n

当前记录的第n个字段,字段间由FS分隔。

$0

完整的输入记录。

ARGC

命令行参数的数目。

ARGIND

命令行中当前文件的位置(0开始算)

ARGV

包含命令行参数的数组。

CONVFMT

数字转换格式(默认值为%.6g)

ENVIRON

环境变量关联数组。

ERRNO

最后一个系统错误的描述。

FIELDWIDTHS

字段宽度列表(用空格键分隔)

FILENAME

当前文件名。

FNR

NR,但相对于当前文件。

FS

字段分隔符(默认是任何空格)

IGNORECASE

如果为真,则进行忽略大小写的匹配。

NF

当前记录中的字段数。

NR

当前记录数。

OFMT

数字的输出格式(默认值是%.6g)

OFS

输出字段分隔符(默认值是一个空格)

ORS

输出记录分隔符(默认值是一个换行符)

RLENGTH

match函数所匹配的字符串的长度。

RS

记录分隔符(默认是一个换行符)

RSTART

match函数所匹配的字符串的第一个位置。

SUBSEP

数组下标分隔符(默认值是\034)

awk把每一个以换行符结束的行称为一个记录。

记录分隔符:默认的输入和输出的分隔符都是回车,保存在内建变量ORSRS中。

$0变量:它指的是整条记录。如$ awk '{print $0}' test将输出test文件中的所有记录。

变量NR:一个计数器,每处理完一条记录,NR的值就增加1。如$ awk '{print NR,$0}' test将输出test文件中所有记录,并在记录前显示记录号。

6.2. 

记录中每个单词称做默认情况下以空格或tab分隔awk可跟踪域的个数,并在内建变量NF中保存该值。如$ awk '{print $1,$3}' test将打印test文件中第一和第三个以空格分开的列()

6.3. 域分隔符

内建变量FS保存输入域分隔符的值,默认是空格或tab。我们可以通过-F命令行选项修改FS的值。如$ awk -F: '{print $1,$5}' test将打印以冒号为分隔符的第一,第五列的内容。

可以同时使用多个域分隔符,这时应该把分隔符写成放到方括号中,如$awk -F'[:\t]' '{print $1,$3}' test,表示以空格、冒号和tab作为分隔符。

输出域的分隔符默认是一个空格,保存在OFS中。如$ awk -F: '{print $1,$5}' test$1$5间的逗号就是OFS的值。

·    $ awk '{print $3}' test-----截取第三域()的内容。

·    $ awk '/^(no|so)/' test-----打印所有以模式noso开头的行。

·    $ awk '/^[ns]/{print $1}' test-----如果记录以ns开头,就打印这个记录。

·    $ awk '$1 ~/[0-9][0-9]$/(print $1}' test-----如果第一个域以两个数字结束就打印这个记录。

·    $ awk '$1 == 100 || $2 < 50' test-----如果第一个或等于100或者第二个域小于50,则打印该行。

·    $ awk '$1 != 10' test-----如果第一个域不等于10就打印该行。

·    $ awk '/test/{print $1 + 10}' test-----如果记录包含正则表达式test,则第一个域加10并打印出来。

·    $ awk '{print ($1 > 5 ? "ok "$1: "error"$1)}' test-----如果第一个域大于5则打印问号后面的表达式值,否则打印冒号后面的表达式值。

·    $ awk '/^root/,/^mysql/' test----打印以正则表达式root开头的记录到以正则表达式mysql开头的记录范围内的所有记录。如果找到一个新的正则表达式root开头的记录,则继续打印直到下一个以正则表达式mysql开头的记录为止,或到文件末尾。

Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE MicrosoftInternetExplorer4 st1\:*{behavior:url(#ieooui) } /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman","serif";}

    awk

    换顺序打印第2列和第3

  awk ‘{print $3 “ “ $2}’

  直接print不带分隔符,要自己加上“ ”

    只打印最后一列,分隔符是“/”

  awk  -F”/” ‘{print $NF}’

    指定多于一个字符作为分隔符

  awk -F  ‘{print $2}’

    如果第1列大于1则打印整行

  awk ‘{if ($1 > 1) print $0}’

 

 

    |[]指定范围

  “|”匹配两个”|”之间的全部字符,在grep中需要扩展模式才能使用(加-E 开关)

    grep -vE “DEBUG|TRACE|NOTICE”

  抛弃含有DEBUG,TRACE,NOTICE中任何一个字符串的行

  “[]”匹配[]中间的单个字符

    grep “ 12-2[34] ”

  提取122324两天的日志

    grep “ 0[89]:[0-5][0-9]:[0-5][0-9] “

  提取08:00:0009:59:59的日志

    grep -E 12-28 23:[0-5][0-9]:[0-5][0-9]|12-29 0[0-3]:[0-5][0-9]:[0-5][0-9]’

  取得2823:00:002903:59:59的日志

 

    \{}指定次数

  \开始一个指定,用{}括起指定次数的数字并用\结束指定

    9\{6\}匹配出现的连续69

    9\{6,\}匹配出现的6个或者更多的连续的9

  grep ‘num=1\{4\} ’

    找到所有含有num=1111的行

  grep ‘num=[0-9]\{4\} ’

    如果不打印最高位的0,会找到num=10009999的行

    否则找到num=00009999的行

  grep ‘num=[0-9]\{5,\}’

    找到所有num10000以上的行

  wc -l *.txt|grep ‘^[0-9]\{4,\}’

    找到所有1000行以上的txt文件

 

    (){}指定范围次数

    ()让里面被括起来的总体参加规则计算

  grep -E ‘(559){1,2}’

    匹配559559559

    grep -E ‘num=[0-9]{1,2}’

  找到num=099间的所有行

    grep -E ‘num=(80){1,2}’

  找到num=80或者8080的所有行

    grep -E num=((80){1,2}|(38){0,3})’

  匹配80,8080,或者38,3838,383838或者所有含num=的行

 

 

    .*做通配符

    “.”匹配任何单个的字符

    “*”匹配0个和任何数量个的任何字符

  grep ‘0a..8d’

    匹配任何0a开头,8d结尾中间有2个字符的字符串

  grep ‘\[*\]’

    匹配任何有用 [ ] 括起来的内容的行

  grep -E ‘\[(.){0,16}\]’

    匹配任何用[]括起来的,里面的内容在016字节间的行

  grep -E ^([a-f]|[0-9]){32}( ){1,}(.){1,16}$’

    在一个含有md5签名的文件内容中匹配出所有文件名在116个字符间的md5签名(32位的16进制数字)

    蓝色部分匹配md5签名,红色部分匹配文件名与签名中间数量不确定的空格,黑色部分匹配文件名

 

    sed中只有基本正则(没有“()”,没有“|”

    sed中的替换命令格式为’s/要找的/要换成的/’

    sed ‘s/htm$/html/’

  将所有行结尾处的htm替换成html

    sed ‘s/^http:\/\///’

  将所有行首的http://删除

    sed ‘s/\[.*\]//’

  ”[“”]”和它们中间的所有内容删除

    sed ‘s/code=[0-9]\{1,\}/code=000/’

  将所有行的code=0….都替换成code=000

 


阅读(382) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~