有没有办法做grep,awk,在一行中应用变量而不是像我的例子中的3?

时间:2018-06-12 14:31:32

标签: 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将它应用于变量

ZDIM=$(cat "awkoutput.txt") 

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

2 个答案:

答案 0 :(得分:1)

是。 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)

答案 1 :(得分:0)

如果您知道在线上有四列,最后三列是数字,您可以将grep输出抓取到变量。

因此,例如在perl样式的正则表达式中使用-P,我们得到环视断言以丢弃部分输出,-o仅输出匹配:

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

其中读取:grep字符串x,y,z:后跟两组数字,然后只抓取第三位数分组,然后只输出匹配。