Linux 如何使用awk打印;“你好”;如果找到模式

Linux 如何使用awk打印;“你好”;如果找到模式,linux,bash,awk,Linux,Bash,Awk,我想在制表符分隔的.txt文件中搜索模式,如果在一行中找到该模式,则打印该行的第三个字段 我只需要找到行中的第一个出现,因为模式肯定只出现一次 .txt文件的结构: XXX01 foo target1 XXX02 bar target2 XXX03 foobar target3 我的第一个想法是,如果找到模式,打印“hello”,控制我的代码是否工作。我还包括传递给bash脚本的变量的回声 命令行调用和脚本: $ ./script.sh file.txt foo #!/bin/bash fi

我想在制表符分隔的.txt文件中搜索模式,如果在一行中找到该模式,则打印该行的第三个字段

我只需要找到行中的第一个出现,因为模式肯定只出现一次

.txt文件的结构:

XXX01 foo target1
XXX02 bar target2
XXX03 foobar target3
我的第一个想法是,如果找到模式,打印“hello”,控制我的代码是否工作。我还包括传递给bash脚本的变量的回声

命令行调用和脚本:

$ ./script.sh file.txt foo

#!/bin/bash
file=$1
pattern=$2


awk '/"$pattern"/{print "hello"}' "$file"

echo "$file"
echo "$pattern"
据我所知,要打印第三个字段,我必须用print“\$2”替换print“hello”

但打印“hello”已经不起作用:

实际产量:

file.txt
foo
期望输出:

hello (respectively target1)
file.txt
foo 
我还确认了,foo在file.txt文件中

进度(请参见评论和回答): 新产出:

awk: 1:unexpected character '.'
file.txt
foo

我相信你想要的是:

$ ./script.sh file.txt foo

#!/bin/bash
file=$1
pattern=$2


awk -v pattern=$pattern'$2==pattern{print "hello",$3}' "$file"

echo "$file"
echo "$pattern"
在这里,我们摆脱了循环,因为
awk
在向每个记录馈送文件时检查它。我们还使用
-v
标志将
$pattern
变量传递到
awk
脚本中。然后我们检查第二个字段
$2
是否为
模式
,并打印
“hello”
,以及第三个字段
$3
的内容

如果需要,您可以将
awk
条件更改为
$2~/pattern/
以真正使用regex,但我怀疑它会打印第1行和第3行,因为
foo
同时显示在这两行中


如果您想检查您的模式是否存在于行中的任何位置,那么您可以删除
$2~
,因此它只是
'/pattern/{print“hello”,$2}

我相信您想要的是:

$ ./script.sh file.txt foo

#!/bin/bash
file=$1
pattern=$2


awk -v pattern=$pattern'$2==pattern{print "hello",$3}' "$file"

echo "$file"
echo "$pattern"
在这里,我们摆脱了循环,因为
awk
在向每个记录馈送文件时检查它。我们还使用
-v
标志将
$pattern
变量传递到
awk
脚本中。然后我们检查第二个字段
$2
是否为
模式
,并打印
“hello”
,以及第三个字段
$3
的内容

如果需要,您可以将
awk
条件更改为
$2~/pattern/
以真正使用regex,但我怀疑它会打印第1行和第3行,因为
foo
同时显示在这两行中

如果您想检查您的模式是否存在于行中的任何位置,那么您可以删除
$2~
,因此它只是
'/pattern/{print“hello”,$2}
看:

$ x="foo"'bar' && echo "$x"
foobar

$ x="foo" 'bar' && echo "$x"
-bash: bar: command not found
您的脚本是:

awk -v p="$2"'$2=="$p"{print "hello",$3}' "$1"
因此,猜猜在
-vp=“$2”
“$2==”$p”
之间不留空格是做什么的。对,它将它们连接在一起,所以不要这样做-添加一个空格:

awk -v p="$2" '$2=="$p"{print "hello",$3}' "$1"
意外的
顺便说一句,是当awk试图将字符串
file.txt
作为其脚本计算时,您的文件名
file.txt中的
,因为串联将实际脚本消耗到
p
的赋值中

现在要在比较中实际使用变量
p
,您必须将其用作变量,而不是将其放入字符串中:

awk -v p="$2" '$2==p{print "hello",$3}' "$1"
以上只是回答了您关于语法错误的问题。要实际执行所需操作,需要执行以下操作之一,具体取决于您是要进行字符串匹配还是正则表达式匹配,以及是要进行部分匹配还是完全匹配:

awk -v p="$2" '$2==p{print "hello",$3}' "$1"
awk -v p="$2" '$2~p{print "hello",$3}' "$1"
awk -v p="$2" '$2~"\\<"p"\\>"{print "hello",$3}' "$1"
awk-vp=“$2”'$2==p{print“hello”,$3}'”$1”
awk-vp=“$2”'$2~p{print“hello”,$3}'”$1”
awk-v p=“$2”'$2~“\\”{print“hello”,$3}'”$1”
或其他一些解决方案,具体取决于您目前尚未说明的需求。

请看:

$ x="foo"'bar' && echo "$x"
foobar

$ x="foo" 'bar' && echo "$x"
-bash: bar: command not found
您的脚本是:

awk -v p="$2"'$2=="$p"{print "hello",$3}' "$1"
因此,猜猜在
-vp=“$2”
“$2==”$p”
之间不留空格是做什么的。对,它将它们连接在一起,所以不要这样做-添加一个空格:

awk -v p="$2" '$2=="$p"{print "hello",$3}' "$1"
意外的
顺便说一句,是当awk试图将字符串
file.txt
作为其脚本计算时,您的文件名
file.txt中的
,因为串联将实际脚本消耗到
p
的赋值中

现在要在比较中实际使用变量
p
,您必须将其用作变量,而不是将其放入字符串中:

awk -v p="$2" '$2==p{print "hello",$3}' "$1"
以上只是回答了您关于语法错误的问题。要实际执行所需操作,需要执行以下操作之一,具体取决于您是要进行字符串匹配还是正则表达式匹配,以及是要进行部分匹配还是完全匹配:

awk -v p="$2" '$2==p{print "hello",$3}' "$1"
awk -v p="$2" '$2~p{print "hello",$3}' "$1"
awk -v p="$2" '$2~"\\<"p"\\>"{print "hello",$3}' "$1"
awk-vp=“$2”'$2==p{print“hello”,$3}'”$1”
awk-vp=“$2”'$2~p{print“hello”,$3}'”$1”
awk-v p=“$2”'$2~“\\”{print“hello”,$3}'”$1”

或者其他一些解决方案,具体取决于您目前尚未说明的需求。

1)您的输出中的
file.txt
来自哪里?第三条记录如何生成输出
foo
?你的输入和输出与你的逻辑不匹配。2) Awk已经迭代了文件中的每一行,因此没有理由进行循环。3) 我们使用
awk
-v
标志将变量传递到awk脚本中。所以这里有很多需要更改的地方。file.txt来自从前到后一行的echo“$file”。foo来自最后一个回声“$pattern”。所以,如果我传递的参数合适的话,最后的回声只是为了控制。当我运行脚本时,它工作正常,所以我认为$1和$2是正确的?更改脚本和标记nextAh!明白了。现在这是有道理的。谢谢。所以,awk逐行遍历我的file.txt文件,我现在知道了。如果我以更改的方式运行脚本,我仍然会得到实际输出。此外,我注意到,我的想法得到第三个领域可能(?)行不通,因为我有问题与2美元?或者awk是这样工作的,\$2用于处理行中的字段?(从谷歌获得\$2)1)你的输出中的
file.txt
来自哪里?第三条记录如何生成输出
foo
?你的输入和输出与你的逻辑不匹配。2) Awk已经迭代了中的每一行