linux - 如果找到模式,如何使用 awk 打印 "hello"

标签 linux bash awk

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

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

.txt 文件的结构:

XXX01 foo target1
XXX02 bar target2
XXX03 foobar target3

我的第一个想法是,如果找到模式,打印“hello”,控制我的代码是否有效。我还包含了我传递给 bash 脚本的变量的 echo 。

命令行调用和脚本:

$ ./script.sh file.txt foo

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


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

echo "$file"
echo "$pattern"

就我在 awk 中找到的而言,要打印第三个字段,我必须将打印“hello”替换为打印“\$2”。

但是打印“hello”已经行不通了:

实际输出:

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

最佳答案

我相信你想要这样的东西:

$ ./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 是否为 pattern 并打印 "hello" 以及第三个字段 $3< 的内容.

如果需要,您可以将 awk 条件更改为 $2~/pattern/ 以真正利用正则表达式,但我怀疑它会将第一行和第三行打印为 foo 出现在两者中。

如果你想检查你的模式是否存在于行中的任何地方,那么你可以删除 $2~ 所以它只是 '/pattern/{print "hello",$2}.

关于linux - 如果找到模式,如何使用 awk 打印 "hello",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46983041/

相关文章:

c++ - VAO 在 macOS 上呈现良好,但在 Linux 上呈现 INVALID_OPERATION

arrays - 获取数组 bash 的随机元素的函数

python - 如何打印文本文件中的某些行和行的某些部分

regex - 使用 sed 或 awk,如何从当前行的末尾匹配回指定的字符?

c - ether_ntoa 指针转换问题

c - 局部变量内存和分配的内存位置

linux -/proc/<pid>status SigIGN 字段

linux - 返回同一文件中最后一个匹配的 String2 之后与文件中的 String1 匹配的所有行

c - 分发可加载的内置 bash 模块

awk - 使用 Awk 去除空格