首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在保留第一行的同时执行Grep

在保留第一行的同时执行Grep
EN

Stack Overflow用户
提问于 2015-01-22 17:54:39
回答 5查看 1.3K关注 0票数 4

我正在试着理解这种奇怪的行为。基本上,我试图grep一个命令的输出,同时仍然保留第一行/标题。提前感谢您的帮助。

成功案例

代码语言:javascript
复制
ps -ef | { head -1; grep bash; }

输出:

代码语言:javascript
复制
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

失败案例

代码语言:javascript
复制
 ls -tlrh / | { head -1; grep tmp; }

输出:

代码语言:javascript
复制
total 100K

(即:忽略/tmp文件夹)

EN

回答 5

Stack Overflow用户

发布于 2015-01-22 18:12:19

尝试使用awk,eks:

代码语言:javascript
复制
ls -tlrh / | awk 'NR==1; /tmp/'

这将打印行号1和带有tmp的行

NR==1;打印行号1

/tmp/打印包含tmp的所有行

票数 4
EN

Stack Overflow用户

发布于 2015-01-22 18:17:50

@Jotne的答案更好,但有时你可以使用grep -E,如果你知道第一行中的某些东西,那么你可以搜索它或其他你想要的东西,比如用竖线符号来表示交替:

代码语言:javascript
复制
ps -ef | grep -E "UID|bash"

输出

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2015-01-22 20:20:37

这不起作用的原因是,两个进程中的第一个进程(头-n1)读取的内容多于其输出的内容。它会消耗ls的输出,不会给grep进程留下任何东西;ps会逐行创建其输出。

解决这个问题的正确方法是为每个需要它的进程复制STDOUT,如下所述

redirect COPY of stdout to log file from within bash script itself

但是,在这里,只需逐行提供读取脚本就足够了,以避免任何缓冲问题:

代码语言:javascript
复制
ls -ltrh / | while { read a; } do echo $a; done | { head -n 1; grep tmp; }

但是,这意味着grep看不到head消耗的行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28085691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档