需要使用awk来获取特定的单词或值在另一个特定的单词之后?
问题描述:
我需要使用awk来获取特定的单词或值,然后在另一个特定的单词之后,我已经尝试了一些awk命令,但在许多其他过滤器(如grep和sed)之后。需要使用awk来获取特定的单词或值在另一个特定的单词之后?
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从一行最小化命令获取所需信息?
答
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
答
你可以用多字去限制使用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
答
这里是一个更通用的方法
... | awk -v k=NRF '{for(i=2;i<=NF;i++) {split($i,a,"="); m[a[1]]=a[2]} print m[k]}'
代码将保持不变,只是改变的关键k
。
答
如果你有GNU awk中可以使用的match
第三个参数:
$ awk 'match($0,/(IC=)([^ ]*)/,a)&& $0=a[2]' file
8
或取得meas
:
$ awk 'match($0,/(meas=)([^ ]*)/,a)&& $0=a[2]' file
2.00
如果你使用的是其他awk中,你可以使用这个组合split
,substr
和match
:
$ awk 'split(substr($0,match($0,/ IC=[^ ]*/),RLENGTH),a,"=") && $0=a[2]' file
8
sed:不是可识别的标志:r 用法:sed [-n] [-u]脚本[文件...] sed [-n] [-u] [-e Script] ... [-f Script_file ] ... [文件...] 它的AIX盒子 – mshafey
尝试'sed's /.* SIZE = \([^] \ + \)。*/\ 1 /'',这里我们必须手动转义。 –
我得到了整个行! – mshafey