繁体   English   中英

从shell脚本中的文件中grep某些东西

[英]To grep something from a file in shell script

我有一个文件,内容如下:

[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

任何帮助,将不胜感激。

提前致谢。

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
$ 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
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

它具有与先前脚本相同的输出。

只是增加了...您也可以在AWK中使用数组来解决此问题:

awk -F'[:;]' '{arr[$2," -",$8]++}END{for (a in arr) print a}' <file>

这将以分号或冒号分隔,然后将元素2和8发送到数组,然后使用for循环遍历数组,打印发现的每个元素,仅导致唯一的值通过。

您可以尝试以下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

没有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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM