Sed 检查并返回无效数据

Sed 检查并返回无效数据,sed,awk,grep,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 201

我需要检查以下数据,并报告与给定条件不匹配的行数

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,最好返回整行。
第三行有一个额外的字,第五行结尾不正确。

要打印无效行:

grep -v '^set [^ ][^ ]* [^ ][^ ]*\\r\\n$' FILENAME
grep -cv '^set [^ ][^ ]* [^ ][^ ]*\\r\\n$' FILENAME
要打印无效行数,请执行以下操作:

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

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}