我需要检查以下数据并报告与给定标准不匹配的行数。
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,最好是整行。 第三行有一个额外的单词,第五行没有正确结束。
答案 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}