跳转到内容

Awk 入门/Shell 脚本中 Awk 的使用

来自维基教科书,开放的书籍,为了开放的世界

Awk 是构建 UNIX/Linux shell 脚本的绝佳工具,但存在潜在的陷阱。假设我们有一个名为“testscript”的脚本文件,它接受两个文件名作为参数

   testscript myfile1 myfile2

如果我们从文件中执行 Awk 命令,处理这两个文件名并不困难。我们可以在命令行上初始化变量,如下所示

   cat $1 $2 | awk -f testscript.awk f1=$1 f2=$2 > tmpfile

Awk 程序将使用两个变量“f1”和“f2”,它们从脚本命令行变量“$1”和“$2”初始化。

当我们直接指定 Awk 命令时,这种方法会变得很麻烦,如果可能,直接指定 Awk 命令是首选的,因为它可以减少实现脚本所需的 文件数量。问题是“$1”和“$2”在脚本文件和 Awk 中的含义不同。对于脚本文件,它们是命令行参数,但对于 Awk,它们表示输入中的文本字段。

这些变量的处理方式取决于 Awk 打印字段的定义方式 - 用双引号 (“ ”) 还是单引号 (' ') 括起来。如果我们像这样调用 Awk

   awk "{ print \"This is a test: \" $1 }" $1

— 我们将不会为“$1”变量打印出任何内容。如果我们改用单引号以确保脚本文件不对 Awk 位置变量进行任何操作,我们可以通过将它们初始化为命令行上的变量来插入脚本文件变量

   awk '{ print "This is a test: " $1 " / parm2 = " f  }' f=$2 < $1

这将“myfile1”中的第一个字段作为第一个参数,并将“myfile2”的名称作为第二个参数。

请记住,Awk 速度相对较慢且笨拙,不应被视为所有脚本文件工作的默认工具。我们可以使用“cat”将内容追加到文件,使用“head”和“tail”从文件开头或结尾截取一定数量的行,使用“grep”或“fgrep”在特定文件中查找行,以及使用“sed”对文件中的流进行搜索替换。

华夏公益教科书