我有一个包含以下内容的文件 -
[1412272372] SERVICE ALERT: abc.com;value;WARNING;HARD;3;WARNING: 2014-09-14
[1412272412] SERVICE ALERT: def.com;value;WARNING;HARD;3;WARNING: 2014-09-14
[1412272432] SERVICE ALERT: fgh.com;value;WARNING;HARD;3;WARNING: 2014-09-14
[1412272442] SERVICE ALERT: fgh.com;value;WARNING;HARD;3;CRITICAL: 2014-09-14
由此,我只想grep网站名称和日期,然后将其保存到新文件。所以在那之后新文件应该如下 -
abc.com - 2014-09-14
def.com - 2014-09-14
fgh.com - 2014-09-14
任何帮助将不胜感激。
提前致谢。
答案 0 :(得分:2)
sed -E 's/.*: ([^;]*);.*: (.*)/\1 - \2/' file | uniq
输出:
abc.com - 2014-09-14 def.com - 2014-09-14 fgh.com - 2014-09-14
或者具有相同输出的异常:
tr -s ":; " ":" < file | cut -d : -f 4,10 --output-delimiter=" - " | uniq
答案 1 :(得分:1)
$ awk -F'[:;]' '{print $2 " -" $NF}' data
abc.com - 2014-09-14
def.com - 2014-09-14
fgh.com - 2014-09-14
fgh.com - 2014-09-14
说明:
-F'[:;]'
您数据的特殊部分是字段有时用冒号分隔,有时用分号分隔。使用-F
选项,我们告诉awk
接受任一字符作为字段分隔符。
print $2 " -" $NF
打印输出。 $2
指的是第二个字段,即站点名称。日期是由$NF
表示的最后一个字段。
$ awk -F'[:;]' '{print $2 " -" $NF}' data | sort -u
abc.com - 2014-09-14
def.com - 2014-09-14
fgh.com - 2014-09-14
答案 2 :(得分:1)
awk -F'[:;]' '{if (seen[$2,$NF]++ == 0) print $2 " -" $NF}' data
这只会打印该网站,如果该日期之前没有看到过。因此,它产生:
abc.com - 2014-09-14
def.com - 2014-09-14
fgh.com - 2014-09-14
输出在网站名称的开头包含空格。如果你想要消除它,那么你需要去:
awk -F'[:; ]' '{if (seen[$5,$NF]++ == 0) print $5 " - " $NF}' data
每次冒号和空格之间都有一个空字段。这会产生:
abc.com - 2014-09-14
def.com - 2014-09-14
fgh.com - 2014-09-14
(诚然,这与之前的输出非常相似)。
您可以使用可重复的分隔符消除空字段:
awk -F'[:; ]+' '{if (seen[$4,$NF]++ == 0) print $4 " - " $NF}' data
这与前一个脚本的输出相同。
答案 3 :(得分:1)
只需添加到堆上...您也可以使用AWK中的数组来解决这个问题:
awk -F'[:;]' '{arr[$2," -",$8]++}END{for (a in arr) print a}' <file>
这将用分号或冒号分割,然后将元素2和8发送到数组,然后使用for循环遍历数组,打印它找到的每个元素,导致只有唯一值通过。
答案 4 :(得分:0)
你可以尝试下面的awk命令,
$ awk -F'[:; ]' '{print $5" - "$12}' file
abc.com - 2014-09-14
def.com - 2014-09-14
fgh.com - 2014-09-14
fgh.com - 2014-09-14
答案 5 :(得分:0)
没有awk:
$ grep WARNING file.log |
cut --delimiter=":" --output-delimiter=";" --fields=2,3 |
cut --delimiter=";" --output-delimiter=" -" --fields=1,7
它比awk更冗长,但恕我直言也更具可读性。如果您想要唯一条目,请将结果通过sort -u
。
如果您没有过滤,只需删除grep命令并在第一个剪切上添加文件名:
$ cut -d : --output-delimiter=";" --fields=2,3 file.log |
cut --delimiter=";" --output-delimiter=" -" --fields=1,7 |
sort --unique