这是我的样本:
6751176513,ahggasda,3453453,hgdahgsd,hgfhgfhg,,
,,
ajhgdha | sajhsgdahj|sdahgdhjaghjsd
6751176513,ahggasda,gdfgdf,2015-10-20 05:15:25,sdfsd,,
我需要打印具有此条件的行:
逗号数量 = 6
第二个字段必须有值(不为 NULL)
第四个字段必须具有时间戳格式 (YYYY-MM-DD HH:MI:SS)
在这种情况下我需要使用“AWK”。
答案1
你最好只使用grep
.我知道这样的正则表达式可能看起来令人畏惧,但如果你退后一步,它会变得更好。
__=[^,]* d=[0-9][0-9] y=$d$d m=$d
grep "^$__,${__%?}$__,$__,$y-$m-$d $d:$d:$d,$__,$__,$__$\
" <<\IN
6751176513,ahggasda,3453453,hgdahgsd,hgfhgfhg,,
,,
ajhgdha | sajhsgdahj|sdahgdhjaghjsd
6751176513,ahggasda,gdfgdf,2015-10-20 05:15:25,sdfsd,,
IN
看?事情并没有那么糟糕——甚至还有一定道理。 BRE 这是一回事(基本正则表达式)非常适合:轻松进行更高层次的抽象。
以上打印。
6751176513,ahggasda,gdfgdf,2015-10-20 05:15:25,sdfsd,,
答案2
如果您不介意使用 awk 和 grep 的组合。
awk -F"," ' {
if ( $2 != "" && $4 ~ /[[:digit:]]{4}(-[[:digit:]]{2}){2} [[:digit:]]{2}(:[[:digit:]]{2}){2}/ ) print
} ' <file> | grep '.*,.*,.*,.*,.*,.*,.*'
编辑:一个纯粹的 awk 替代品。感谢@Archemar 指出这一点。
awk -F"," ' {
if ( NF == 7 && $2 != "" && $4 ~ /[[:digit:]]{4}(-[[:digit:]]{2}){2} [[:digit:]]{2}(:[[:digit:]]{2}){2}/ ) print
} ' <file>