当我这样做时:
LINE=$(head -38 fine.txt | tail -1 | cut -f2)
我得到了文件的第38行,它是:
Xres = 1098
但我只需要记录1098作为变量的值。
我正在接受阅读文本文件和记录值的培训,并在稍后的脚本中使用它们作为参数。
将| awk '{print $3}'
添加到管道中。
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
的第三个元素。