需要使用awk来获取另一个特定单词后的特定单词或值吗?

时间:2017-04-03 13:44:22

标签: bash awk sed

我需要使用awk来获取另一个特定单词之后的特定单词或值,我已经尝试了一些awk命令但是在许多其他过滤器之后,例如grep和sed。我需要获取单词的文件具有相同的行多次,如下面一行:

Configuration: number=6 model=MSA SNT=4 IC=8 SIZE=16384MB NRF=24 meas=2.00

如果需要24我用过

grep IC file | awk 'NF>1{print $NF}'

如果需要16384MB我用过

grep IC file | awk -F'SIZE=' '{ print $2 }'|awk '{ print $1 }'

我们需要使用awk从该行获取任何单词?我使用的东西可以得到所需的东西,但我们仍然需要一个最小化的awk命令。

我确信我们可以使用一个awk从一行最小化命令中获取所需的信息吗?

4 个答案:

答案 0 :(得分:1)

sed -r  's/.*SIZE=([^ ]+).*/\1/' input
16384MB
sed -r  's/.*NRF=([^ ]+).*/\1/' input
24

grep方式:

grep -oP 'SIZE=\K[^ ]+' imput
16384MB

awk方式:

awk '{for(i=1;i<=NF;i++) if($i ~ /SIZE=/) split($i,a,"=");print a[2]}' input 

答案 1 :(得分:1)

您可以使用带有多字符限制器的Awk,如下所示。遍历字段,匹配您需要的模式并打印包含字段值的下一个字段。

awk -F'[:= ]' -v option="${match}" '{for(i=1;i<=NF;i++) if ($i ~ option) {print $(i+1)}}' file

实施例中,

match="number"
awk -F'[:= ]' -v option="${match}" '{for(i=1;i<=NF;i++) if ($i ~ option) {print $(i+1)}}' file
6

match="model"
awk -F'[:= ]' -v option="${match}" '{for(i=1;i<=NF;i++) if ($i ~ option) {print $(i+1)}}' file
MSA

match="meas"
awk -F'[:= ]' -v option="${match}" '{for(i=1;i<=NF;i++) if ($i ~ option) {print $(i+1)}}' file
2.00

答案 2 :(得分:1)

这是一种更通用的方法

... | awk -v k=NRF '{for(i=2;i<=NF;i++) {split($i,a,"="); m[a[1]]=a[2]} print m[k]}' 

代码将保持不变只需更改密钥k

答案 3 :(得分:0)

如果你有GNU awk,你可以使用$ awk 'match($0,/( IC=)([^ ]*)/,a)&& $0=a[2]' file 8 的第三个参数:

meas

或者获取$ awk 'match($0,/( meas=)([^ ]*)/,a)&& $0=a[2]' file 2.00

split

如果你使用其他一些awk,你可以使用substrmatch$ awk 'split(substr($0,match($0,/ IC=[^ ]*/),RLENGTH),a,"=") && $0=a[2]' file 8 的这种组合:

A          B
Type 15    5
Type 2     7
Type 3     9