检查并返回无效数据

时间:2012-03-17 01:03:04

标签: sed awk grep

我需要检查以下数据并报告与给定标准不匹配的行数。

set 582:1960:4c31ed7dea 2012-03-10~23:55:00\r\n
set 565:388:13c10fd316 2012-03-10~23:55:00\r\n
set 519:348:361189d4b9 extra_text 2012-03-10~23:55:00\r\n
set 498:5634:6047172ecc 2012-03-10~23:55:00\r\n
set 565:0:bf7a80ee4f 2012-03-10~23:55:00

1)所有行都应以“set”开头,并以“\ r \ n”

结尾

2)所有行都应该有空格分隔的3个字段。

在示例数据中,它应返回无效行数:2,最好是整行。 第三行有一个额外的单词,第五行没有正确结束。

2 个答案:

答案 0 :(得分:1)

打印无效行:

grep -v '^set [^ ][^ ]* [^ ][^ ]*\\r\\n$' FILENAME

要打印无效行数:

grep -cv '^set [^ ][^ ]* [^ ][^ ]*\\r\\n$' FILENAME

答案 1 :(得分:1)

awk对此有好处。一个功能齐全的脚本:

#!/usr/bin/awk -f

BEGIN {ends = fields = total = 0 }

NF != 3 || !/\r$/ {
    total++
    if(NF != 3) fields++
    if(!/\r$/) ends++
    print
}

END {
    printf "Wrong number of fields: " fields
    printf "Did not end in a CR: " ends
    printf "Total: " total
}

短一行,只打印违规行:

awk 'NF != 3 || !/\r$/' file

打印和计算总数:

awk 'NF!=3||!/\r$/{total++} END{print "Total: " total}