鉴于此格式:
DISKGROUP NAME GB ALLOCATED GB USED GB FREE USABLE GB PCT USED STATUS
-------------- --------------- --------------- --------------- --------------- -------- --------------------
DISK_1 1,117.40 390.48 726.92 223.78 34.95 MOUNTED
DISK_2 1,117.40 65.97 1,051.43 386.04 5.90 MOUNTED
使用单个bash命令如何可靠地从GB FREE获取值?字段之间的空格数可以非常基于字段大小,因此我无法指定具有剪切的静态空格数。有没有办法使用空格作为分隔符,但空格的数量是可变大小?
感谢您的任何想法
答案 0 :(得分:7)
您可以使用awk
:
awk 'BEGIN {print "GB FREE\n--------"} NR>2{print $4}' INPUT_FILE
awk's BEGIN
语句打印标题GB FREE and -------
。这是因为输入文件中的标题在标题中有空格。这可以抛弃awk
脚本。 awk's
内置变量NR
来存储行号。由于我们不希望打印第1行和第2行,因此我们保持NR>2
的条件。这样awk将跳过前两行并从第3行开始打印。awk
中,分隔符或字段分隔符是空格(一个或多个)。由于您的文件有,我们不需要设置FS
内置变量。由空格分隔的每个字段都成为一列,可以使用$
和column number
进行访问。由于您希望GB FREE
列为4,我们会print $4
。 column 1
DISK_2
NR>2 && $1~/DISK_2/
的行,我们会添加另一个模式语句。使用column 1
可确保我们不会打印第1行和第2行,并查找DISK_2
中包含column 4
的行,并打印这些行的awk 'NR>2{print $4}' INPUT_FILE
行。 awk 'NR>2 && $1~/DISK_2/{print $4}' INPUT_FILE
或
[jaypal:~/Temp] cat file
DISKGROUP NAME GB ALLOCATED GB USED GB FREE USABLE GB PCT USED STATUS
-------------- --------------- --------------- --------------- --------------- -------- --------------------
DISK_1 1,117.40 390.48 726.92 223.78 34.95 MOUNTED
DISK_2 1,117.40 65.97 1,051.43 386.04 5.90 MOUNTED
[jaypal:~/Temp] awk 'BEGIN {print "GB FREE\n--------"} NR>2{print $4}' file
GB FREE
--------
726.92
1,051.43
[jaypal:~/Temp] awk 'BEGIN {print "GB FREE\n--------"} NR>2 && $1~/DISK_2/{print $4}' file
GB FREE
--------
1,051.43
{{1}}
答案 1 :(得分:1)
这可能对您有用:
sed '1,2d;s/\(\S*\s*\)\{3\}\(\S*\).*/\2/' file
如上标题:
sed '1,2c\ GB FREE\n--------'$'\n'';s/\(\S*\s*\)\{3\}\(\S*\).*/\2/' file
或仅限DISK_2
:
sed '/^DISC_2/s/\(\S*\s*\)\{3\}\(\S*\).*/\2/p;d' file
如上标题:
sed '/^DISK_2/s/\(\S*\s*\)\{3\}\(\S*\).*/\2/;s/^/ GB FREE\n--------\n/p;d' file