我正在尝试编写一个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
将被设置为1
before read file1
。该变量将保留该值(除非它被程序更改),直到读取awk
文件为止。file2
然后将其设置为2
等。
这意味着您的命令行在读取之前正确地将变量设置ID
为。4
text.sql
-v ID=4
和 this之间的区别ID
是不会在任何块中设置BEGIN
。使用-v ID=4
集合ID
to4
和 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