如何使用awk打印"你好"如果找到模式

时间:2017-10-27 20:36:26

标签: linux bash awk

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

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

.txt文件的结构:

XXX01 foo target1
XXX02 bar target2
XXX03 foobar target3

我的第一个想法是,打印"你好"如果找到模式,控制,如果我的代码工作。我还包括了传递给我的bash脚本的变量的回声。

命令行调用和脚本:

$ ./script.sh file.txt foo

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


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

echo "$file"
echo "$pattern"

据我发现它为awk,要打印第三个字段,我将不得不替换print" hello"打印" \ $ 2"。

但是打印"你好"已经不起作用了:

实际输出:

file.txt
foo

期望的输出:

hello (respectively target1)
file.txt
foo 

我也确定,那是" foo"在file.txt中

进展(请参阅评论和答案):

#!/bin/bash

awk -v p="$2"'$2=="$p"{print "hello",$3}' "$1"

echo "$1"
echo "$2"

新产品:

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

2 个答案:

答案 0 :(得分: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脚本。然后,我们检查第二个字段$2pattern并打印"hello"以及第三个字段$3的内容。

如果您愿意,可以将awk条件更改为$2~/pattern/以真正使用正则表达式,但我怀疑它会打印第1行和第3行,因为foo显示在两者中。

如果你想检查你的模式是否存在于该行的任何位置,那么你可以删除$2~,使其只是'/pattern/{print "hello",$2}

答案 1 :(得分: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"

所以猜猜在-v p="$2"'$2=="$p"之间没有留下空格的是什么。是的,它是连接它们所以不要这样做 - 添加一个空格:

awk -v p="$2" '$2=="$p"{print "hello",$3}' "$1"

意外的. btw是您的文件名.中的file.txt,当awk尝试将字符串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"

或其他一些解决方案,具体取决于您迄今未说明的要求。