D30
我们可以将awk和Shell脚本结合使用来执行各种任务。一般会将信息传入awk脚本,再将信息以对Shell有用的格式传回。
1. 在awk中使用Shell变量
awk程序作为大的Shell脚本的一部分。如使用shell变量来保存awk程序搜索用的模式是很常见的。
两种方法来在awk程序中获取shell变量的值:
1)最常见的方法:使用Shell引用来替换变量的值到Shell脚本内部的awk程序中。
$ cat info.txt Linux - Sysadmin Database - Oracle, MySQL etc. Security - Firewall, Network, Online Security etc. Cool - Websites $ cat awkSearchpattern.sh #!/bin/bash #202006 read -p "Enter search pattern: " pattern awk "/$pattern/"‘{ nmatches++; print } END { print nmatches " found." }‘ info.txt #awk中"/$pattern/"这一部分用双引号括起来,是为了允许引号内的Shell变量进行替换 #执行,输入etc $ ./awkSearchpattern.sh Enter search pattern: etc Database - Oracle, MySQL etc. Security - Firewall, Network, Online Security etc. 2 found.
变量替换是通过引用实现的,可能导致潜在的混乱,需要对Shell的引用规则具有很好的了解。阅读时,匹配引号比较复杂。
2)更好的方法:使用awk的变量赋值功能,将Shell变量的值指定为awk变量的值,然后使用动态的正则表达式来匹配模式。
用此方法改进上面的例子,可以看到awk程序只用单引号,赋值语句中仍用"$pattern"是为了避免输入的内容中有空格。
$ cat awkSearchpattern_better.sh #!/bin/bash #202006 read -p "Enter search pattern: " pattern #采用awk的-v选项指定awk变量pat,将shell变量的值赋给pat awk -v pat="$pattern" ‘$0 ~ pat { nmatches ++; print } END { print nmatches " found." }‘ info.txt $ ./awkSearchpattern_better.sh Enter search pattern: etc Database - Oracle, MySQL etc. Security - Firewall, Network, Online Security etc. 2 found.
awk程序还可以访问Shell的环境变量。awk解释器会在以环境变量名为索引的ENVIRON数组中存储Shell环境变量的一个拷贝。
#使用shell的环境变量PATH
$ awk ‘path=ENVIRON["PATH"] { print "The PATH is: " path }‘ /tmp/empty
2. 从awk命令的输出中设置shell变量
使用awk命令的输出对Shell变量进行赋值的示例:
$ x=`awk -F‘-‘ ‘/Linux/{ print $2 }‘ info.txt` $ echo $x Sysadmin
可以通过awk命令输出赋值语句到变量中,执行语句给多个变量赋值
$ z=`awk -F‘ - ‘ ‘{ if ($1 ~ "Linux") print "x="$2; if ( $1 ~ "Cool" ) { print "y="$2 } }‘ info.txt` $ echo $z x=Sysadmin y=Websites $ eval $z $ echo $x Sysadmin $ echo $y Websites
还可以使用source命令从awk命令的输出中设置Shell变量。
$ awk -F‘ - ‘ ‘{ if ($1 ~ "Linux") print "x="$2; if ( $1 ~ "Cool" ) { print "y="$2 } }‘ info.txt > defVar $ cat defVar x=Sysadmin y=Websites $ source defVar $ echo $x Sysadmin $ echo $y Websites
本节结束