Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux脚本:在特定列中搜索关键字_Linux_Search_Awk_Grep - Fatal编程技术网

Linux脚本:在特定列中搜索关键字

Linux脚本:在特定列中搜索关键字,linux,search,awk,grep,Linux,Search,Awk,Grep,我有一个包含多列数据的大文本文件。我试图编写一个脚本,从命令行接受列号和关键字,并在显示所有匹配项的整行之前搜索所有匹配项 我一直在尝试以下几点: grep$fileName | awk'{if($'$columnNumber'=='$searchTerm')打印$0;}' 但这根本不起作用。我说的对吗?谢谢你的帮助 看起来很合理。尝试使用set-x查看传递给awk的确切内容。您还可以使用不同和/或更多awk功能,包括摆脱单独的grep: awk -v colnum=$columnNumber

我有一个包含多列数据的大文本文件。我试图编写一个脚本,从命令行接受列号和关键字,并在显示所有匹配项的整行之前搜索所有匹配项

我一直在尝试以下几点:

grep$fileName | awk'{if($'$columnNumber'=='$searchTerm')打印$0;}'


但这根本不起作用。我说的对吗?谢谢你的帮助

看起来很合理。尝试使用
set-x
查看传递给
awk
的确切内容。您还可以使用不同和/或更多awk功能,包括摆脱单独的grep:

awk -v colnum=$columnNumber -v require="$searchTerm"
    "/$fileName/ { if (\$colnum == require) print }"
它通过设置awk变量(
colnum
require
,在本例中)然后使用文本字符串
$colnum
获取所需字段,使用变量
require
获取所需字符串来工作


请注意,在所有情况下(无论是否使用
grep
命令),
$fileName
中的任何正则表达式元字符都将是meta-y,例如。,
this.that
将匹配名为
this.that
的文件,但也匹配名为
thisXthat
的文件,-v选项可用于将shell变量传递给
awk
命令

以下可能是您正在寻找的内容:

awk-vs=$SEARCH-vc=$COLUMN'$c==s{print$0}'file.txt

编辑:

我总是试图编写更优雅、更紧凑的代码。这就是丹尼斯的意思:


awk-vs=“$search”-vc=“$column”'$c==s{print$0}”file.txt

谢谢:-)很高兴我能help@user1136076:我建议引用那些shell变量。另外,
(复数)是一个环境变量,与您的
变量的名称非常相似。我建议您习惯性地使用小写或混合大小写变量名,以减少名称冲突的机会。请注意,“print$0”是多余的。你可以简单地做awk…'$c==s'file.txtI有一个函数,可以在一列中搜索一个字符串,我如何允许它,以便我可以为脚本提供多个列来搜索多个搜索字符串?awk-vs=$1-vc=$2'$c~s{print$0}'$3感谢您使用了
-v
变量传递和嵌入式shell变量。我建议您只使用变量传递,对外部集合使用单引号,并避免分心的转义。使用
-v
时,还应引用所有shell变量。匹配变量时,需要使用匹配运算符而不是斜杠。以下是您答案的修订版本:
awk-v colnum=“$columnnume”-v require=“$searchTerm”-v file=“$fileName””$0~文件和$colnum==require'
。请注意,
print
是隐含的。@DennisWilliamson:是的,我对列号的引用有点懒散,因为它首先必须是一个数字。请注意,“$0~var”在旧的awk中不起作用,例如SunOS:
$awk'$0~“pattern”
给出:
awk:第1行附近的语法错误。如果您不必处理古老的awk,请使用全变量版本。