欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

awk 笔记  

程序员文章站 2024-03-23 16:50:52
...

1. 分割符: awk -F: '{print $1,$5}' test

   多分割符: awk -F'[:\t]' '{print $1,$3}' test

2. awk 环境变量:[不全]

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

    > $0 完整的输入记录.

    > FILENAME 当前文件名

    > FS 字段分割符.

    > NF 当前记录中的字段数.

    > NR 当前记录数.

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

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

3. 匹配操作:

    awk '$1 ~/^root/' test 将显示test文件第一列中以root开头的行。

    awk '{max = {$1 > $3} ? $1: $3: print max}' test。如果第一个域大于第三个域,$1就赋值给max,否则$3就赋值给max。    

4. 范围模板:  awk '/root/,/mysql/' test将显示root第一次出现到mysql第一次出现之间的所有行。

5. 将多行按分割符合并为一行:

    cat ip.txt | awk -v  RS="["  '{print $1, $2, $3}'

6. 实例:    

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

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

    $ 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开头的记录范围内的所有记录。

 

 

笔记原文:    http://www.linux.gov.cn/shell/awk.htm