使用grep / sort删除行中的多个换行符

时间:2013-12-01 17:12:16

标签: c shell sorting filter grep

我制作了一个实现 printenv |的C程序grep [参数] |排序|少了,但由于某种原因,我在输出开始时得到了一堆换行符。可能是因为我是如何将父进程中的环境变量写入grep进程的。如果我运行myProgram PATH我的结果:

/*40 blank lines */
INFOPATH=/usr/share/info
MANPATH=/usr/local/vol/matlab/7.4.0/man:/usr/kerberos/man:/usr/local/share/man:/usr    /share/man/en:/usr/share/man:/usr/man
MODULEPATH=/usr/local/vol/modulefiles:/pkg/modules/modulefiles:/etc/site/modulefiles:    /usr/share/Modules/modulefiles:/etc/modulefiles
PATH=/usr/lib/heimdal/bin:/usr/local/vol/comsol/3.4/bin:/usr/local/vol/maple/10.05/bin:/usr/local/vol/matlab/7.4.0/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/opt/real/RealPlayer
WMMENUPATH=/usr/local/vol/maple/menudef/10.05:/usr/local/vol/fvwm2/menudefs/emacs:/usr/local/vol/fvwm2/menudefs/acroread

我正在使用C调用shell程序并将其连接到管道。每个程序(grep,sort,less / more)都在它自己的子进程中调用并通过管道传输给其他程序。父进程通过如下管道将环境变量写入grep:

for(i=0; envp[i]!=NULL; i++)
{
    return_value = write(pipe_fd[0][PIPE_WRITE],envp[i], strlen(envp[i]));
    errorCheck(return_value, "Cannot write to pipe in parent\n");
    return_value=write(pipe_fd[0][PIPE_WRITE],"\n",1);
    errorCheck(return_value, "Cannot write to pipe in parent\n");
}

我尝试在排序调用中添加了一堆选项,但到目前为止还没有任何工作。 我的问题是,如果有办法忽略grep或sort行中的多个换行符?

3 个答案:

答案 0 :(得分:0)

在读取最终输出块的循环上,执行类似这样的操作

int flag=1;
char prev='\n';
while(fgets(buf, f, sizeof(buf)) {
 if (buf[0]='\n' && prev='\n' && flag) next
 flag = 0;

如果第一行是单个\ n,则会跳过此行,因此将会跳过任意​​数量的\ n行

答案 1 :(得分:0)

从输出流中过滤掉空行:

... | grep . | ...

或者,过滤掉只包含空格的任何行:

... | grep '\S' | ...

答案 2 :(得分:0)

使用grep,您可以使用

过滤掉空行
grep -v '^$'

使用awk你可以做更多奇特的事情,比如用一个替换多个空行:

awk '/^$/ {if (!e) {e=1;print}} /./ {e=0; print}'

这会产生以下结果:

% (echo hello;echo;echo;echo;echo;echo world) | awk '/^$/ {if (!e) {e=1;print}} /./ {e=0; print}'
hello

world

请注意输出中的单个空行。