82.awk命令
语法格式
awk 'pattern' filename # file中所有包含的pattern的行都将打印出来
awk '{action}' filename # 这种情况下,action将作用于filename中的每一行上
awk 'pattern {action}' filename # action将被作用于filename中匹配到pattern的行
action只有print这个操作,没有类似于sed中的替换、编辑等操作符
输入内容可以是标准输入,文件,管道,以及其他shell命令的输出
例子:
awk '/Martin/' people.txt # 显示people.txt中包含Martin的行
awk '{print $1}' people.txt #打印people.txt中每一行的第一列
awk '/Martin/{print $1,$2}' people.txt #打印匹配到Martin的行的第一列和第二列
管道输入:
cat people.txt | awk '$3 > 6500' 或者 cat '$3 > 6500' people.txt
awk '/1972$/{print $1 , $2}' people.txt # 打印匹配到1972的行的第一个和第二个元素
awk的工作原理:
1、程序从文件中读入一行,将这一行的内容放到一个内部变量$0中。
2、读入的一行被分割为单词或者属性,每一个单词按顺序被存储到一个内部变量中,如$1,$2...每一行最多只能有100个单词
3、awk内部有一个内部分隔符,默认是空格符,用于读取输入时作为分隔符,但是可以被设定为其他字符;还有一个输出分割符,被用作输出内容到终端时每个单词间的分割。
awk命令也可以被写入脚本中,执行时指定-f参数就可以。
cat awk_script
output:/Martin/{print $1,$2}
awk -f awk_script people.txt
83.NR:行号
是awk程序的内部变量,记录了每一行的行号。
awk '{print NR,$0}' people.txt
output:
1 Bill Thomas 8000 08/9/1968
2 Fred Martin 6500 22/7/1982
3 Julie Moore 4500 25/2/1978
4 Marie Jones 6000 05/8/1972
5 Tom Walker 7000 14/1/1977
84.field:属性,awk默认根据空格和tab键来分隔单词。使用$1 $2 $3来访问一个个属性。
awk '{print NR,$1,$2,$4}' awk_name.txt
85.-F:设置默认的单词分隔符。并且可同时设置多个分隔符。
cat people.txt
output:
Bill Thomas:8000:08/9/1968
Fred Martin:6500:22/7/1982
Julie Moore:4500:25/2/1978
Marie Jones:6000:05/8/1972
Tom Walker:7000:14/1/1977
awk -F: '/Marie/{print $1,$2}' people.txt #指定:为单词间的分隔符
awk -F'[:\t]' '{print $1,$2,$3}' people.txt #将:以及\t两个字符设置为分隔符
86./Pattern/{action}:如果action为空,那么就会直接打印匹配到pattern的内容;如果action不为空,那么就会对匹配到的行执行action.
awk '$3 > 5000' people.txt #打印第三个属性大于5000的行。
output:
Bill Thomas 8000 08/9/1968
Fred Martin 6500 22/7/1982
Marie Jones 6000 05/8/1972
Tom Walker 7000 14/1/1977
87.action:操作必须放在{}中,多个操作可以按行分割;如果多个操作在同一行,那么应该用;分割
pattern{ action statement; action statement; .. } or
pattern
{ action statement
action statement
}
88.awk的正则通配符。
元字符 | 含义 |
---|---|
· | 匹配到一个字符 |
* | 0个或多个字符匹配到 |
^ | 匹配到字符串的开头 |
$ | 匹配到字符串的结尾 |
+ | 匹配到一个或多个字符 |
? | 匹配到0个或者一个字符 |
[ABC] | 匹配到ABC中的任何一个 |
[^ABC] | 不能匹配到ABC中的任何一个 |
[A-Z] | 匹配到A-Z中的任何一个 |
a|b | 匹配到a或者b |
(AB)+ | 匹配到一个或多个AB,ABAB,ABABAB |
* | 匹配到*字面量 |
& | 表示匹配打的内容。 |
89.编写awk脚本。
注意:脚本中只需要包含命令。awk程序和被执行的文件都不需要写在脚本中。
cat report
/Bill/{print "Birth date of " $1,$2 " is " $4}
/^Julie/{print $1,$2 " has a salary of $" $3 "."}
/Marie/{print NR,$0}
执行脚本:
awk -f report people.txt
90.类型声明。
name=“Ganesh”#字符串
j++ #数字
value=50# 数字
将数字类型转变为字符串:
value " "
将字符串转变为数字:
name + 0
91.条件语句。
语法:
if (conditional-expression)
action1
else
action2
例子:
cat people.txt
output:
Bill Thomas 8000 08/9/1968
Fred Martin 6500 22/7/1982
Julie Moore 4500 25/2/1978
Marie Jones 6000 05/8/1972
Tom Walker 7000 14/1/1977
awk '{
if($3 > 7000){
print "perpon with salary more than 7000 is \n",$1," ",$2;
}
}' people.txt
92.循环语句。
for (initialization;condition;increment/decrement)
actions
例子:
NF:代表该行的field数量。
awk 'for(i=1;i<=NF;i++) print NF,$i }' people.txt
while循环:
while(condition)
actions
awk '{ i=1;while(i <= NF){ print NF,$i;i++}}' people.txt
do while循环:
do
action
while(condition)
例子:
awk '{ do { ++x;print x;} while(x <=4 )}'