awk命令
简介
awk是一种样式扫描与处理工具,它是三个人名的首字母缩写。它几乎可以完成grep和sed所能完成的全部工作,同时它还可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。当前有awk,nawk和gawk三个版本。
特点
1. awk不同于sed,不自动输出行;
2. awk不使用单个字符的选项来控制输出,而是通过一系列函数来控制输出;
3. awk含有大量的内置函数和语句(大多类似于C语言),使得awk更像一门编程语言,处理问题的能力大大增强。
用法
awk有两种调用方法:在命令行中指定编辑指令;将编辑指令存储到一个文件中,在awk命令中调用该文件。
方法1: awk [options] '/pattern/{actions}' files
方法2: awk [options] -f scriptfile files (其中scriptfile中是/pattern/{actions}的集合)
选项
-F 更改字段分隔符(默认为空格或tab) -F; 将字段分隔符设定为;
-f 调用scriptfile文件
-v 调用shell变量;
-v var=$shell_var; 此后,在awk中可以直接用var($可省略)代替$shell_var; 每引用一个shell_var都要使用一下选项-v
☆ pattern和actions(awk语句的重要组成部分)
1. pattern包含以下任意内容
选定文本范围(正则表达式;指定行号和范围,同sed);
关系表达式:<, >, <=, >=, ==, !=, 此外还包括两种匹配模式,如下
value ~ /pattern/ value匹配pattern则为真
value !~ /pattern/ value不匹配pattern则为真
复合表达式:可以是文本范围匹配和关系表达式的任意组合,&&, ||, 其中每个子表达式需用()括起来
BEGIN模式: 让用户指定在第一行文本被处理之前所发生的动作(通常在这里可以设置全部变量)
END模式: 让用户在最后一条记录被读取之后发生的工作
2. action
由一个或多个命令、语句、函数、表达式组成,之间用换行符或分号隔开,并用{}括起来。主要有四部分内容:
变量或数组赋值;
输出命令;
内置函数;
控制流命令(条件控制;循环控制)
注:pattern可选,若没有指定pattern为输入文件的每一行执行actions
变量
设置变量
fruit=apple 将fruit变量值设为apple
myfruit=fruit 将变量myfruit设置为变量fruit的值(故fruit和myfruit都被设置为apple)
fruit=$1 将变量fruit设置为每一行的第一个字段
此外,+=,-=,*=,/=,%=,^=这样的赋值操作符用于改变变量的值
内置变量
FILENAME 当前输入文件的文件名,不应改变该变量的值;
NR 当前行的编号,不应改变该变量的值;
NF 当前行中域的编号,不应改变该变量的值;
OFS 输出域分隔符(缺省为空格)
FS 输入域分隔符(缺省为空格或tab键)
ORS 输出记录分隔符(缺省为换行符)
RS 输出记录分隔符(缺省为换行符)
$0 当前行的全部内容
$1,$2,... 当前行的第一个字段,第二个字段,等等
if语句
f (expression1) {
action1
} else if (expression2) {
action2
} else {
action3
}
while语句
while (expression) {
actions
}
do语句
do {
actions
} while (expression)
for语句
for (initialize_counter; test_counter; increment_counter) {
actions
}
next命令
作用:跳出剩余的语句
例: awk '$3 <= 75 {printf "%s%t%s\n",$0,"REORDER"; next; } #若满足该条件,下面的语句不执行
$3 > 75 {print $0;}' test.txt
举例
1. awk '{print;}' test 打印test文件的每一行(;不可省)
2. awk '{print $1 $2;}' test 打印test文件每一行的第一和第二个字段,输出结果没用分隔符分割
3. awk '{print $1,$2;}' test 打印test文件每一行的第一和第二个字段,输出结果用空格分割
4. awk '{printf "%-32s %s\n",$1,$2;}' test 利用printf格式化输出(同C语言)
5. awk '/ *\$[1-9][0-9]*\.[0-9][0-9] */ {print $0,"*"}' $0原原本本地输出匹配到的内容
6. BEGIN和END模式
awk '
BEGIN {printf "%s\t", FILENAME;}
/^ *$/ {x+=1;}
END {ave=100*x/NR; printf "%s\t%3.1f\n", x,ave;}
' test.txt
7. 改变FS(域分隔符)
awk -F: '{print $1, $3;}' test.txt
awk 'BEGIN {FS=":";}{print $1,$6;}' test.txt
没有评论:
发表评论