编写一个从命令行读取变量的 awk 脚本

编写一个从命令行读取变量的 awk 脚本

我正在尝试编写一个awk脚本,该脚本可以从命令行读取用户输入并将其存储为变量。

我知道如果我从命令行编译并执行

./myawk.awk -v ID=4 text.sql

ID 将是一个设置为 4 的变量。但是,为我的脚本提供的输入测试用例只是

./myawk.awk ID=4 text.sql

该脚本的最终目标是获取一个 ID,找到以

-- ID

并打印以下行。到目前为止我所拥有的是

#!/bin/awk -f
{
  if ($1 ~/--/ && $2 ~/^ID/){
    x = NR+1
  }
  while (NR <= x){
    print $0
  }
}

我如何能够在不更改该行并-v在其之前添加的情况下读取变量 ID,也可能为我当前的awk脚本提供建议。

答案1

如果在脚本的命令行上将变量赋值作为文件操作数给出,则在使用文件操作数时到达该点awk时将执行该赋值。awk

例子:

awk -f script.awk a=1 file1 file2 a=2 file3 a=3 file4

这里,awk变量a将被设置为1before read file1。该变量将保留该值(除非它被程序更改),直到读取awk文件为止。file2然后将其设置为2等。

这意味着您的命令行在读取之前正确地将变量设置ID为。4text.sql

-v ID=4和 this之间的区别ID是不会在任何块中设置BEGIN。使用-v ID=4集合IDto4和 it将要以块形式提供BEGIN

您的代码的另一个问题是您用作ID文字细绳

if ($1 ~/--/ && $2 ~/^ID/){

也就是说,您测试第二个字段是否以字符串 开头ID

似乎您还希望while循环遍历文件的行。逐行读取循环已经内置到awk操作方式中,并且它很少需要明确。

反而,

$1 == "--" && $2 == ID { getline; print }

这将使用字符串比较(不是正则表达式匹配)来检查当前行上的第一个空格分隔字段是否是字符串--,以及第二个这样的字段是否是变量的值ID。如果是,则读取并打印下一行输入。

要改用正则表达式,

$0 ~ "^-- " ID "$" { getline; print }

这将匹配以双破折号和单个空格开头的每一行,后跟 的值ID和行尾($匹配行尾)。将打印匹配行之后的行。

答案2

以下是如何使用 awk 读取用户输入:

awk '
    BEGIN {
        printf "Enter an ID: "
        # "-" is the filename for stdin
        getline id < "-"
    }
    # then we can use that value however we like
    $1 == "--" && $2 == id {getline; print}
' file

答案3

I Tried with below method and it worked fine


 #!/bin/bash
echo "enter the number"
read p
awk -v p="$p" '$1 == "--" && $2 == p {print $0}' filename

相关内容