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
:
awk
df -h | awk 'NR==1 || /^\/dev/'
Run Code Online (Sandbox Code Playgroud)
NR
是当前行号,所以awk
如果这是第一行或者当前行以/dev
. 发布此内容后,我看到它与@1_CR 的答案相同。那好吧...
珀尔
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
开关将打印输入文件的所有行。当前行的值被保留,$_
所以我们设置$_
为空,除非我们想要当前行。
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)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)
df -h | tee >(head -1) >(sleep 0.5;grep ^/dev) > /dev/null;sleep 1.0
Run Code Online (Sandbox Code Playgroud)