cat file
aaa
bbb
bbb
ccc
ddd
eee
eee
fff
只显示重复的行:
bbb
bbb
eee
eee
sed -n ':a;N;/(.+)n1/!D;p' file
[解析]
读取下一行,如果两行内容一样的打印,然后跳转命令行尾,不执行 D ,如果没匹配到就 D 删除第一行,跳转去命令行首继续执行。
awk 'i{if($0==x){print x"
"x;i=0}}{x=$0;i=1}' file <(echo)
以上的例子仅局限在两行重复的情况,那么有多行重复的情况呢?比如:
cat file
aaa
bbb
bbb
bbb
ddd
eee
eee
要得到:
bbb
bbb
bbb
eee
eee
sed -n '$!N;/(.*)n1$/{P;ba};x;/(.*)n1$/P;x;:a;h;D' file
[解析]
整体的思路是判断如果是相邻两行重复的话,就 P 打印第一行,然后把当前的 pattern space 中,当相邻行不匹配重复时,x 交换两个空间的内容,把 hold space 里的内容(就是上一行的 pattern space里的内容后拷贝到的 hold space),再匹配看是否两行重复,如果重复的话就打印。这样就把连续的相邻的行打印出来,避免了因为前两行相同,而第三行和第四行不匹配的话,就无法 打印第三行的内容了。这个思路很值得借鉴。另外该代码可以优化为
sed -n '$!N;/(.*)n1$/{P;ba};x;//P;x;:a;h;D' file
//P 就可以省略匹配的内容。
REF:
http://blog.chinaunix.net/uid-10540984-id-3034540.html