(P9)awk:什么是awk,awk简单用法,awk脚本语法,awk执行过程

文章目录

    • 1.什么是awk
    • 2.awk简单用法
    • 3.awk脚本语法
    • 4.awk执行过程

1.什么是awk

  • awk 是什么
    awk 是一种用于处理数据和生成报告的编程语言
    awk 可以在命令行中进行一些简单的操作,也可以被写成脚本来处理较大的应用问题
    awk 与 grep、sed 结合使用,将使 shell 编程更加容易
    Linux 下使用的 awk 是 gawk

  • awk 如何工作
    awk 逐行扫描输入 ( 可以是文件或管道等 ),按给定的模式查找出匹配的行,然后对这些行执行 awk 命令指定的操作。

  • 与 sed 一样,awk 可以使用重定向将 awk 的输出保存到文件中。

2.awk简单用法

  • awk简单用法如下:
    (P9)awk:什么是awk,awk简单用法,awk脚本语法,awk执行过程_第1张图片
  • eg:
awk -F: '{ print $1 }' /etc/passwd
$1表示第1列,$0表示整行
awk -F: '{ print $1, $3 }' /etc/passwd
awk -F: '{ print $1 "|" $3 }' /etc/passwd
输出的话,按照|进行分割
awk -F: '/root/{ print $1 "|" $3 }' /etc/passwd
awk -F: '/^root/' /etc/passwd

3.awk脚本语法

  • awk 命令的一般形式:
    (P9)awk:什么是awk,awk简单用法,awk脚本语法,awk执行过程_第2张图片
    其中 BEGIN {actions} 和 END {actions} 是可选的
    awk_script 可以由一条或多条 awk_cmd 组成,每条 awk_cmd 各占一行;
    每个 awk_cmd 由两部分组成:/pattern/{actions};
    awk_cmd 中的 /pattern/ 和 {actions} 可以省略,但不能同时省略;/pattern/ 省略时表示对所有的输入行执行指定的 actions;{actions} 省略时表示打印整行;

4.awk执行过程

① 如果存在 BEGIN ,awk 首先执行它指定的 actions
② awk 从输入中读取一行,称为一条输入记录
③ awk 将读入的记录分割成数个字段,并将第一个字段放入变量 $1 中,第二个放入变量 $2 中,以此类推;$0 表示整条记录;字段分隔符可以通过选项 -F 指定,否则使用缺省的分隔符。
④ 把当前输入记录依次与每一个 awk_cmd 中 pattern 比较:如果相匹配,就执行对应的 actions; 如果不匹配,就跳过对应的 actions,直到完成所有的 awk_cmd
⑤ 当一条输入记录处理完毕后,awk 读取输入的下一行,重复上面的处理过程,直到所有输入全部处理完毕。
⑥ awk 处理完所有的输入后,若存在 END,执行相应的 actions
⑦ 如果输入是文件列表,awk 将按顺序处理列表中的每个文件。

  • eg:
获取ip
ifconfig | awk '/inet addr/{ print $2 }' | awk -F: '{ print $2 }'

ifconfig | awk '/inet addr/{ print $2 }' | awk -F: 'BEGIN { print "begin..."} { print $2 } END { print "end..."} '
  • 模式匹配
    ① 使用正则表达式:/rexp/,如 /^A/、/A[0-9]*/
    awk 中正则表达式中常用到的元字符有:
    (P9)awk:什么是awk,awk简单用法,awk脚本语法,awk执行过程_第3张图片
    ② 使用布尔 ( 比较 ) 表达式,表达式的值为真时执行相应的操作 (actions)
1)表达式中可以使用变量 ( 如字段变量 $1,$2)/rexp/2)表达式中的运算符有
 关系运算符:   <   >   <=   >=   ==   !=
 匹配运算符:    ~   !~   
	x ~ /rexp/  如果 x 匹配 /rexp/,则返回真;
	x!~ /rexp/  如果 x 不匹配 /rexp/,则返回真。

eg:
awk '$1 > 20 {print $0}' test.in
awk '$2 ~ /^6/ {print $0}' test.in
$2表示第2列的第1个字符

(3) 复合表达式:&& ( 逻辑与 )|| ( 逻辑或 )! ( 逻辑非 )
expr1 && expr2  两个表达式的值都为真时,返回真
expr1 || expr2  两个表达式中有一个的值为真时,返回真
!expr   表达式的值为假时,返回真

eg:
awk '($1<20)&&($2~/^6/){print $0}' test.in
awk '($1<20)||($2~/^6/){print $0}' test.in
awk '!($2~/^6/){print $0}' test.in
awk '/^#/ && /#$/{ print $0 }' test.in
行首和行尾都是#号
注:表达式中有比较运算时,一般用圆括号括起来
  • 字段分隔符、重定向和管道
    (1)字段分隔符
awk –F: '{print $1}' test.in

awk -F'[ :]' '{print $1}' test.in

awk 中的字段分隔符可以用 -F 选项指定,缺省是空格。
(2)重定向与管道

awk '{print $1, $2 > "output"}' test.in
awk 'BEGIN{
     "cal" | getline a; print a}‘
Getline表示获取第一行到a

  • 更多awk
    awk不仅是一个命令,它更是一个编程语言
1)变量
	内部变量:
    	 awk ' {print NR,$0} '	#给文件加上行号
		NR是内部变量,表示给文件加上行号
	自定变量:知道即可

(2)函数
	内置函数
	自定义函数
     awk '{ print sum($1,$2) } function sum(x,y) { s=x+y ; return s }' grade.txt

(3)数组
     awk 'BEGIN {
      print split("123#456",arr,"#") ; for (i in arr) {
      print arr[i] } }‘
split内置函数表示:按照#分割,分割的函数放在arr数组中

你可能感兴趣的:(鸟哥Linux私房菜)