![cut / grep 和 df -h](https://linux22.com/image/23657/cut%20%2F%20grep%20%E5%92%8C%20df%20-h.png)
如何 grep 或剪切“Verf”下的“173G”?
我需要这个来在学校编写 Unix 脚本。
jonas@jonaspc:~/$ df -h /dev/sda2
Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf
/dev/sda2 293G 121G 173G 42% /media/Windows
答案1
对于此类任务最舒适的解决方案是awk
:
df -h /dev/sda2 | awk 'NR==2{print$4}'
或者,如果列出了更多分区,您可以通过安装点选择正确的行:
df -h | awk '$1=="/dev/sda2"{print$4}'
使用也很简单sed
,但是如果您需要稍后安装几次来调试它,则不太好:
df -h /dev/sda2 | sed -rn '2s/^((\S+)\s+){4}.*/\2/p'
df -h | sed -rn '/^\/dev\/sda2/s/^((\S+)\s+){4}.*/\2/p'
假设 GNU sed
。 POSIX 兼容语法包括许多转义:
df -h /dev/sda2 | sed -n '2s/^\(\(\S\+\)\s\+\)\{4\}.*/\2/p'
df -h | sed -n '/^\/dev\/sda2/s/^\(\(\S\+\)\s\+\)\{4\}.*/\2/p'
答案2
如果必须使用 grep 和 cut,可以执行以下操作:
df -h /dev/sda2 | grep sda | cut -d" " -f14
但这非常丑陋,因为您必须计算空格(-f14)以及@manatwork 使用 awk 的原因。您可以使用tr
或其他工具使其更美观,并能够指定要剪切的真实字段:
df -h /dev/sda2 | grep sda | tr -s " " " " | cut -d" " -f4
或者,较新的 grep 支持仅输出部分匹配,您可以将其与 bash 技巧结合使用:
df -h /dev/sda2 | grep -o '[^[:space:]]*G' | cut -d$'\n' -f3
正则表达式可能更安全,但这会找到所有大小字段并每行输出一个,而 cut 选择第二个。
答案3
这里的所有其他答案都很好,但是如果您使用重击,不需要使用awk、sed、grep、cut等外部程序。
以下行将执行您想要的操作:
{ read; read -r _ _ _ av _; } < <(df -h /dev/sda1)
“$av”将是 /dev/sda1 上的可用大小
如果您只想使用数字部分“$av”(例如123在 123G 中),您可以使用参数扩展像这样修剪不相关的部分:
ir="${av##*[0-9]}"; echo "${av%$ir}"
或者只是"${av%?}"
如果您确定后缀“$av”只有一个字母。
答案4
如果不一定是grep
/ cut
,您也许可以使用 获得相同的信息stat
。在文件系统模式下,%a
是可用块数和%s
块大小,也是%a * %s
以字节为单位的可用空间,您可以根据自己的喜好用它进行数学运算,将其分解为您选择的更合适的单位,例如:
echo $((`stat -f -c "%a*%s" /media/windows/`/1024/1024/1024))GiB