![如何使用 awk 命令分离这两个输出](https://linux22.com/image/31645/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20awk%20%E5%91%BD%E4%BB%A4%E5%88%86%E7%A6%BB%E8%BF%99%E4%B8%A4%E4%B8%AA%E8%BE%93%E5%87%BA.png)
这是我的输出:
MessageID=3990592283244651750-30192b51.13df831d93a.7eb4;EsbTiming=2013-04-12T01:07:46.099
我想要的只是时间。
我怎样才能将它们分开?
答案1
分析输入的结构:
key1=value1;key2=value2
这些是由 分隔的字段;
,您可以通过设置;
字段分隔符来解析它们。然后,要提取字段的值,请使用该sub
函数删除该key=
部分(或split
on/=/
并获取第二部分,或获取index
of后面的子字符串=
)。如果时间始终在第二个字段中,这是一个简单的方法:
awk -F ';' '{sub(/^[^=]*=/, $2); print $2}'
如果您想按名称访问该字段(这可能更可靠),您可以循环遍历这些字段:
awk -F ';' '{i=1; while (i <= NF) {if ($i ~ /^EsbTiming=/) {sub(/^[^=]*=/, $i); print $i}}}'
如果只有一行要解析,则制作;
记录分隔符和=
字段分隔符会更简单。
awk -F '=' -v RS=';' '$1 == "EsbTiming" {print $2}'
请注意,这会打印一个额外的换行符。如果您在 shell 脚本的命令替换中使用此命令,则不必担心(… | awk …)
。如果您不需要这个额外的换行符,请将ORS
(输出记录分隔符)设置为空字符串:
awk -F '=' -v RS=';' -v ORS= '$1 == "EsbTiming" {print $2}'
还有直接正则表达式方法,这里给出了很好的结果。
awk 'match($0, /(^|;)EsbTiming=/) {s = substr($0, RSTART+RLENGTH); sub(/;.*/, "", s); print s}'
答案2
您有几个 awk 答案,这是您可以使用 bash 实现的一种方法。首先评估变量设置:
source <(echo "MessageID=3990592283244651750-30192b51.13df831d93a.7eb4;EsbTiming=2013-04-12T01:07:46.099")
您现在可以EsbTiming
直接访问,例如:
printf "Date: %s\nTime: %s\n" ${EsbTiming%T*} ${EsbTiming#*T}
输出:
Date: 2013-04-12
Time: 01:07:46.099
答案3
awk 'BEGIN{ FS=":" } /Timing/ {print $2":"$3 }' Input_file
或者
awk '/Timing/{split($0,arr,":") } {print arr[2]":"arr[3]}' input_file
或者
awk -F: '/Timing/{$1=""; print}' input_file
格雷普解决方案
grep -oP '(?<=EsbTiming=.{14}).*' Input_file
答案4
如果您不介意使用awk
,sed
这里有一个非常简单的方法:
sed 's/.*Timing=//' file.txt |awk -FT '{print $2}'
sed
部分折叠所有内容,直到并包括字符串“Timing=”,留下:
2013-04-12T01:07:46.099
awk
在字符“T”上分割,我们打印出第二个字段,即您的时间。
01:07:46.099