谁使用bash从文本文件中获取/复制特定单词?

时间:2014-01-09 19:49:17

标签: bash terminal

当我这样做时:

LINE=$(head -38 fine.txt | tail -1 | cut -f2)

我得到文件的第38行,即:

Xres  = 1098

但我只需要记录1098作为变量的值。

我正在训练读取文本文件并记录值,并在我的脚本中稍后将它们用作参数。

2 个答案:

答案 0 :(得分:0)

| awk '{print $3}'添加到管道中。

答案 1 :(得分:0)

sed -n '38s/.*= *//p' fine.txt

默认情况下,sed会打印每个输入行。 -n选项禁用此行为。 38选择第38行,当看到这一行时,替换将所有内容替换为最后一个等号,并打印。

假设第二个字段是最后一个字段。如果输入行比我假设的更复杂,请尝试替换s/^[^\t]*\t[^\t]*= *//p。如果您的sed无法将\t识别为制表符,则需要提供文字制表符(您可以在某些shell中输入一个带有键序列ctrl-v标签的制表符。)

如果输入文件很大,您可能需要重构sed脚本以在第38行之后退出。

结束,这让我们

LINE=$(sed -n '38!b;s/^[^\t]*\t[^\t]*= *//p;q' fine.txt)

然而,这变得有些复杂,以至于妨碍了易读性和可维护性。 Awk中的相同内容更具可读性;

awk -F '\t' 'NR==38 { sub(/.*= */,"",$2); print $2; exit 0 }' fine.txt

更一般地说,您可能希望拆分选项卡,然后拆分空格。以下更准确地实现了cut -f2 | awk '{ print $3 }'

awk -F '\t' 'NR==38 { split($2,f); print f[3]; exit 0 }' fine.txt

选项-F '\t'将标签设置为输入字段分隔符。条件NR==38选择第38行,split($2,f)将空格中第二个以制表符分隔的字段拆分为数组f。然后我们只打印f的第三个元素和exit