从shell脚本中的文件中获取内容

时间:2014-10-03 17:56:16

标签: linux bash shell

我有一个包含以下内容的文件 -

[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

任何帮助将不胜感激。

提前致谢。

6 个答案:

答案 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