shell脚本学习-06

7 篇文章 0 订阅
7 篇文章 0 订阅

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 )}'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值