2012-03-17 81 views
0

我需要检查以下数据并报告与给定条件不匹配的行数。检查并返回无效数据

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)所有行应该开始以词“设置”和结束“\ r \ n”个

2)所有的线应具有确切3号由空格分隔字段。

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

回答

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} 
1

要打印的无效行:

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

要打印无效的行数:

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