Bash 有没有一种方法可以将grep、awk和apply变量放在一行中,而不是像我的示例中那样放在3行中?

Bash 有没有一种方法可以将grep、awk和apply变量放在一行中,而不是像我的示例中那样放在3行中?,bash,Bash,因此,目前我希望将大型文本文档中的单个值应用于变量,以便稍后在bash脚本中应用 初始文本文件并不重要,但它在十几个文本文件中有一行,内容如下: x,y,z: 2000 2000 500 x,y,z对于文件来说是唯一的,所以我可以用grep轻松地抓取这一行 grep x,y,z textfile.txt > xyz.txt 然后我只是用awk制作一个文件 awk '{print $4}' xyz.txt > awkoutput.txt 然后我用cat把它应用到一个变量上 ZDI

因此,目前我希望将大型文本文档中的单个值应用于变量,以便稍后在bash脚本中应用

初始文本文件并不重要,但它在十几个文本文件中有一行,内容如下:

x,y,z: 2000 2000 500
x,y,z对于文件来说是唯一的,所以我可以用grep轻松地抓取这一行

grep x,y,z textfile.txt > xyz.txt
然后我只是用awk制作一个文件

awk '{print $4}' xyz.txt > awkoutput.txt
然后我用cat把它应用到一个变量上

ZDIM=$(cat "awkoutput.txt") 

ZDIM随后用于指示另一个文本文件的计算。这是可行的,但我是一个bash新手,我想知道是否有一种更优雅的方式来编写它,而不是创建一堆稍后需要rm的文本文件。

是的
awk
完全能够执行正则表达式匹配,因此您可以删除
grep

awk '/x,y,z/ {print $4}' textfile.txt
awk
的输出写入文件,然后捕获
cat
的输出,两者之间没有区别;只需捕获
awk
的输出。所以你可以用

ZDIM=$(awk '/x,y,z/ {print $4}' textfile.txt)

即使
awk
无法进行正则表达式匹配,并且
cat
在某种程度上是必要的,您也可以使用管道而不是创建临时文件

ZDIM=$(grep x,y,z textfile.txt | awk '{print $4}' | cat)

如果您知道行中有四列,最后三列是数字,那么您可以将grep输出抓取到一个变量

例如,在perl风格的正则表达式中使用
-p
,我们得到环顾断言以删除部分输出,而
-o
仅输出匹配:

ZDIM=$(grep -oP 'x,y,z: \d+ \d+ \K\d+')

其中的内容是:grep字符串
x,y,z:
,后跟两组数字,然后只抓取第三组数字,然后只输出匹配项。

可能仍会询问此数据是否真的需要在变量中。在shell变量中存储大量数据通常是一种反模式。至少在这种情况下,它看起来是合法的。OP说键是唯一的,所以
awk
只输出一行。