现在的位置: 首页 > 综合 > 正文

awk 使用小例

2018年04月14日 ⁄ 综合 ⁄ 共 2196字 ⁄ 字号 评论关闭

【基础】
$0 表示整个当前行
$1 表示第一个字段
-F 指定分隔符
$ awk -F":" '{ print $1 " " $3 }' /etc/passwd

【BEGIN 和 END 块】
BEGIN块:awk 在开始处理输入文件之前会执行 BEGIN 块,因此它是初始化 FS(字段分隔符)变量、打印页眉或初始化其它在程序中以后会引用的全局变量的极佳位置
END块: awk 在处理了输入文件中的所有行之后执行这个块, 用于执行最终计算或打印应该出现在输出流结尾的摘要信息。

【规则表达式和块】
/foo/ { print }
/[0-9]+\.[0-9]*/ { print }
$1 == "fred" { print $3 }
$5 ~ /root/ { print $3 }

【条件语句】
awk中条件语句语法与C语言相同
if ($5 ~ /root/) { print $3 }
if ($1 == "foo" && $2 == "bar") { print $0}

【字符串化变量】
只要变量包含有效数字字符串,awk 会自动处理字符串到数字的转换步骤。
x="1.01"
x=x+1
{ print ($1^2)+1 }
如果某个特定变量不包含有效数字,awk 在对数学表达式求值时会将该变量当作数字零处理。

【运算符】
+ - * / ^(指数运算符) %(模)
前后加减(i++, --foo)
加/减/乘/除赋值运算符(a+=3 、 b*=2 、 c/=2.2 、 d-=6.2)

【字段分隔符】
FS (field separator): FS值并没有被限制为单一字符;可以通过指定任意长度的字符模式,将它设置成规则表达式
FS="\t+" # 处理由一个或多个tab 分隔的字段
FS="[[:space:]+]" # 字段由空格分隔
FS="foo[0-9][0-9][0-9]" # 记录由单词 "foo" 分隔,后面跟着三个数字
FS默认为空格

【记录分隔符】
RS (record separator) RS告诉awk当前记录什么时候结束,新记录什么时候开始

【字段数量】
NF awk会自动将该变量设置成当前记录中的字段数量

【记录号】
NR 它始终包含当前记录的编号(awk 将第一个记录算作记录号1)

【记录、循环、数组】
1. 多行记录
BEGIN {
FS="\n"
RS=""
}
将FS设置成"\n"告诉awk每个字段都占据一行
将RS设置成"",还会告诉 awk 每个地址记录都由空白行分隔

2. OFS 和 ORS
print "Hello", "there", "Jim!"
这行代码中的逗号并不是实际文字字符串的一部分。它告诉awk "Hello"、"there" 和 "Jim!" 是单独的字段,并且应该在每个字符串之间打印 OFS 变量
OFS (output field separator)输出字段分隔符,默认为单个空格
ORS (output record separator)输出记录分隔符,默认为换行(\n)

3. 循环结构
while(){}
do{}while()
for(initial assignment; comparison; increment) {code block}
break
continue

4. 数组
awk中数组下标从1开始,按如下方式遍历数组:
for(x in myarray){print myarray[x]}
但有个缺点:当awk在数组下标之间轮转时,它不会依照任何特定的顺序
字符串化下标:awk的数组是字符串化下标,成为关联数组, 如myarr["name"]="Mr. Whipple"
删除数组元素:delete myarray[1]
查看是否存在某个特定数组元素:if(1 in myarray){print "yes"}

【格式化输出】
printf("%s got a %d on the last test\n","Jim",83)

【字符串函数】
length(mystring) 返回字符串长度
index(mystring, "you") 返回子字符串在另一个字符串中出现的位置
tolower(mystring) 转换成小写字母
toupper(mystring) 转换为大写字母 【注意:tolower() 和 toupper() 返回新的字符串,不会修改原来的字符串】
mysub=substr(mystring, startpos, maxlen)
print match(mystring,/you/), RSTART, RLENGTH
match() 函数将返回匹配的起始位置,如果没有找到匹配,则返回 0。此外,match() 还将设置两个变量,叫作 RSTART 和 RLENGTH。
RSTART 包含返回值(第一个匹配的位置),
RLENGTH 指定它占据的字符跨度(如果没有找到匹配,则返回 -1)

sub(regexp,replstring,mystring) : 它将在 mystring 中匹配 regexp 的第一个字符序列,并且用 replstring 替换该序列
gsub(regexp,replstring,mystring) : 它将在 mystring 中匹配 regexp 的所有字符序列,并且用 replstring 替换该序列

numelements=split("Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",mymonths,",")
split() 的任务是“切开”字符串,并将各部分放到使用整数下标的数组中,返回分割的字符串元素的数量

【注意】调用 length()、sub() 或 gsub() 时,可以去掉最后一个自变量,这样 awk 将对 $0(整个当前行)应用函数调用

抱歉!评论已关闭.