我正在试着理解这种奇怪的行为。基本上,我试图grep一个命令的输出,同时仍然保留第一行/标题。提前感谢您的帮助。
成功案例
ps -ef | { head -1; grep bash; }输出:
UID PID PPID C STIME TTY TIME CMD
username 1008 1 0 Jan21 tty1 00:00:00 -bash
username 1173 1008 0 Jan21 tty1 00:00:00 -bash失败案例
ls -tlrh / | { head -1; grep tmp; }输出:
total 100K(即:忽略/tmp文件夹)
发布于 2015-01-22 18:12:19
尝试使用awk,eks:
ls -tlrh / | awk 'NR==1; /tmp/'这将打印行号1和带有tmp的行
NR==1;打印行号1
/tmp/打印包含tmp的所有行
发布于 2015-01-22 18:17:50
@Jotne的答案更好,但有时你可以使用grep -E,如果你知道第一行中的某些东西,那么你可以搜索它或其他你想要的东西,比如用竖线符号来表示交替:
ps -ef | grep -E "UID|bash"输出
UID PID PPID C STIME TTY TIME CMD
502 510 509 0 8:01am ttys000 0:00.08 -bash
502 48806 510 0 10:18am ttys000 0:00.00 grep -E UID|bash发布于 2015-01-22 20:20:37
这不起作用的原因是,两个进程中的第一个进程(头-n1)读取的内容多于其输出的内容。它会消耗ls的输出,不会给grep进程留下任何东西;ps会逐行创建其输出。
解决这个问题的正确方法是为每个需要它的进程复制STDOUT,如下所述
redirect COPY of stdout to log file from within bash script itself
但是,在这里,只需逐行提供读取脚本就足够了,以避免任何缓冲问题:
ls -ltrh / | while { read a; } do echo $a; done | { head -n 1; grep tmp; }但是,这意味着grep看不到head消耗的行。
https://stackoverflow.com/questions/28085691
复制相似问题