unix命令打印“=”后面的数字

unix命令打印“=”后面的数字

我有一个文件,其中包含以下格式的制表符分隔的列

AAA BBB;CCC;DDD;E=10;F=20 GGG
XXX YYY;ZZZ;DDD;E=50;F=40 PPP

我需要使用 UNIX 命令打印值E(或)。F

  10
  50

答案1

用于cut获取第四个字段,然后sed删除等号之前的所有内容:

cut -f 4 -d\; | sed 's/.*=//'

但是,您提到了制表符分隔的字段,尽管您的示例行用分号分隔字段。

答案2

借助 GNU grep,使用 PCRE ( -P) 模式:

$ grep -Po '(?<=E=)\d+' file
10
50

或者

$ grep -Po '(?<=F=)\d+' file
20
40

答案3

$ echo 'AAA BBB;CCC;DDD;E=10;F=20 GGG' | awk -F';' '{ print $4 }' | awk -F= '{ print $2 }'
10
$ echo 'XXX YYY;ZZZ;DDD;E=50;F=40 PPP' | awk -F';' '{ print $4 }' | awk -F= '{ print $2 }'
50

或者更简单:

$ echo 'XXX YYY;ZZZ;DDD;E=50;F=40 PPP' | awk 'match($0, /=[0-9]+/) { print substr($0, RSTART + 1, RLENGTH - 1) }'
50
$ echo 'AAA BBB;CCC;DDD;E=10;F=20 GGG' | awk 'match($0, /=[0-9]+/) { print substr($0, RSTART + 1, RLENGTH - 1) }'
10

答案4

如果您不关心该行的其余部分,如果您只想查找它们E=F=它们出现的任何位置,您可以使用sed

sed -e 's/.*E=//' -e 's/;.*//'

这将删除“ ”之前的所有内容(包括“ E=”),然后删除“ ”;及其后面的所有内容。它假设每一行包含 ” E=”。

如果您知道该E=字段始终出现在特定列中(各列由制表符或分号或其他内容分隔),则最好首先使用cut或等效项提取该列,然后将E=部分与值分开。您可以使用sed@berndbausch 的答案来做到这一点,或者使用cut假设=分隔列的第二次调用。

相关内容