我需要使用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从一行最小化命令中获取所需的信息吗?
答案 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,你可以使用substr
,match
和$ 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