读书人

awk 札记

发布时间: 2012-09-06 10:37:01 作者: rapoo

awk 笔记

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

读书人网 >编程

热点推荐