[Linux Shell学习系列十四]sed和awk-6.awk与Shell

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

本节结束

相关推荐