linux shell之awk

举报
chenyu 发表于 2021/07/26 23:26:19 2021/07/26
2.1k+ 0 0
【摘要】 1 awk awk 是一款设计用于数据流的工具, awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处 awk 脚本的结构基本如下所示: awk ' BEGIN{print "start" } pattern { commands } END{ print "end" } file awk 脚本通常由3部分组成。 BEGIN , END 和带模式...

1 awk

awk 是一款设计用于数据流的工具, awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处
awk 脚本的结构基本如下所示:

awk ' BEGIN{print "start" } pattern { commands } END{ print "end" } file
 

awk 脚本通常由3部分组成。 BEGIN , END 和带模式匹配选项的常见语句块。这3个部分都是可选项,在脚本中可省略任意部分。

2 命令执行过程

awk 命令的工作方式如下所注。
(1) 执行 BEGIN { commands } 语句块中的语句。
(2) 从文件或 stdin 中读取一行,然后执行 pattern { commands } 。重复这个过程,直到文件全部被读取完毕。
(3) 当读至输入流末尾时,执行 END { commands } 语句块。
 

3 一般使用

1)普通执行一个最简单的命令


      echo -e "hello\nword" | awk 'BEGIN{print "chenyu"} {print} END{print "linux shell"}'
      chenyu
      hello
      word
      linux shell
  
 

要记得打印是print "chenyu",这里是双引号

2)带参数打印


      echo | awk '{var1="v1"; var2="v2"; var3="v3"; print var1 "-" var2 "-" var3}{}{}'
      v1-v2-v3
      echo | awk '{var1="v1"; var2="v2"; var3="v3"; print var1, var2, var3}{}{}'
      v1 v2 v3
  
 

参数要用双引号,打印print后面用,隔开

3 特殊变量

以下是可以用于 awk 的一些特殊变量。
NR :表示记录数量,在执行过程中对应于当前行号。
NF :表示字段数量,在执行过程中对应于当前行的字段数。
$0 :这个变量包含执行过程中当前行的文本内容。
$1 :这个变量包含第一个字段的文本内容。
$2 :这个变量包含第二个字段的文本内容。


      echo -e "chen gong yu\n chen cai feng\n chen zi xuan" | awk '{print "Line no:" NR ", all field:" NF, "$0 =" $0, "$1="$1, "$2="$2 "$3="$3}'
      Line no:1, all field:3 $0 =chen gong yu $1=chen $2=gong$3=yu
      Line no:2, all field:3 $0 = chen cai feng $1=chen $2=cai$3=feng
      Line no:3, all field:3 $0 = chen zi xuan $1=chen $2=zi$3=xuan
      echo -e "chen gong \n chen cai feng\n chen zi xuan" | awk '{print "Line no:" NR ", all field:" NF, "$0 =" $0, "$1="$1, "$2="$2 "$3="$3}'
      Line no:1, all field:2 $0 =chen gong  $1=chen $2=gong$3=
      Line no:2, all field:3 $0 = chen cai feng $1=chen $2=cai$3=feng
      Line no:3, all field:3 $0 = chen zi xuan $1=chen $2=zi$3=xuan
  
 

awk 的一些基本用法

1) 打印每一行的第2和第3个字段
 


      cat 1.txt
      1111 22 33
      111  44 55
      awk '{print $2, $3}' 1.txt
      22 33
      44 55
  
 

 或者我们打印字一行字符串的第二个字符串


      echo "hello word" | awk '{print $1}'
      hello
  
 

输出的命令得到的结果和awk组合使用


      info1=$(md5sum 1.cpp | awk '{print $1}')
      info2=$(md5sum 1.cpp | awk '{print $2}')
      echo $info1
      2f56b3e40c1bdd15feb924049e127b23
      echo $info2
      1.cpp
  
 

2) 要统计文件中的行数


      awk 'END{ print NR }' file
      awk 'END{print NR}' 1.txt
      2
  
 

3) awk默认是的字段定界符是空格,我们也可以用-F进行来指定如下


      echo "chen*yu*ni*hao" | awk -F '*' '{print $3}'
      ni
  
 

4 将外部变量值传递给 awk

方式1


      value=chenyu
      echo | awk -v vvv=$value '{print vvv}'
      chenyu
  
 

方式2


      var1="chen" ; var2="yu"
      echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2
      chen yu
  
 

五:总结

一般我们要得到打印的字符串或者文本里面的第几行的第几个字段一般使用awk命令。

经典简单用法如下:


      value=$(echo "chen*yu*ni*hao" | awk -F '*' '{print $3}')
      echo $value
      ni
  
 

      value1=$(echo "chen yu ni hao" | awk '{print $3}')
      echo $value1
      ni
  
 

文章来源: chenyu.blog.csdn.net,作者:chen.yu,版权归原作者所有,如需转载,请联系作者。

原文链接:chenyu.blog.csdn.net/article/details/88610133

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。