[英]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.