Grep 行,但让第一行通过

Ern*_*t A 30 shell grep pipe text-processing

考虑以下来自 的输出df

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        23G  6.1G   16G  29% /
udev             10M     0   10M   0% /dev
tmpfs           397M  420K  397M   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           1.8G  904K  1.8G   1% /run/shm
/dev/sda6       890G  324G  521G  39% /home
/dev/sdb1       459G  267G  169G  62% /home/user/mnt
none            4.0K     0  4.0K   0% /sys/fs/cgroup
Run Code Online (Sandbox Code Playgroud)

我怎样才能只显示"/dev"以标题开头并保留标题的行,而过滤掉其他所有内容。我还想不必诉诸于使用临时文件或变量?注意:标题取决于语言环境,因此您无法使用正则表达式捕获它。

ter*_*don 41

我会使用比简单更复杂的方法grep

  1. awk

    df -h | awk 'NR==1 || /^\/dev/'
    
    Run Code Online (Sandbox Code Playgroud)

    NR是当前行号,所以awk如果这是第一行或者当前行以/dev. 发布此内容后,我看到它与@1_CR 的答案相同。那好吧...

  2. 珀尔

    df -h | perl -ne 'print if (/^\/dev/ || $.==1)'
    
    Run Code Online (Sandbox Code Playgroud)

    这里的想法相同,在 Perl 中,特殊变量$.是当前行号。另一种方法是

    df -h | perl -pe '$_="" unless /^\/dev/ || $.==1'
    
    Run Code Online (Sandbox Code Playgroud)

    -p开关将打印输入文件的所有行。当前行的值被保留,$_所以我们设置$_为空,除非我们想要当前行。

  3. sed

    df -h | sed -n '1p; /^\/dev/p'
    
    Run Code Online (Sandbox Code Playgroud)

    -n抑制正常输出所以没有线被打印。该1p方式打印的第一行和/^\/dev/p手段打印任何行与开始/dev

    正如下面的评论所指出的,在不太可能的情况下,当前系统上的语言环境导致标题行以 开头/dev,上面的命令将打印两次。Stephane Chazelas指出,这个不会有这个问题:

    df -h | sed  -e 1b -e '/^\/dev/!d'
    
    Run Code Online (Sandbox Code Playgroud)
  4. grep

    df -h | grep -E '^(/dev|File)'
    
    Run Code Online (Sandbox Code Playgroud)

    由于您所说的 LOCALE 问题,这可能不可移植。但是,我有理由确定没有语言环境或df版本会在第一行给出路径,因此搜索包含 no 的行也/应该有效:

    df -h | grep -E '^[^/]*$|^/dev'
    
    Run Code Online (Sandbox Code Playgroud)


iru*_*var 15

您将在尝试解析 df output 时遇到问题,但是对于简单的情况,以下可能有效

LC_ALL=C df -P | awk 'NR == 1 || /^\/dev/' 
Run Code Online (Sandbox Code Playgroud)


dan*_*ann 12

这也应该有效(但未测试):

df | (read a; echo "$a"; grep /dev)
Run Code Online (Sandbox Code Playgroud)

或者

df | (head -n 1; grep ^/dev)
Run Code Online (Sandbox Code Playgroud)


Rob*_*obs 5

df -h | tee >(head -1) >(sleep 0.5;grep ^/dev) > /dev/null;sleep 1.0
Run Code Online (Sandbox Code Playgroud)

  • 我刚试过;它打印了标题行*first*。 (2认同)