Bash简单的字符串解析

Zug*_*dud 1 bash awk sed

鉴于这种格式:

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   
Run Code Online (Sandbox Code Playgroud)

使用单个bash命令,如何可靠地从GB FREE获取值?字段之间的空格数可以非常基于字段大小,因此我无法指定具有剪切的静态空格数.有没有办法使用空格作为分隔符,但空格的数量是可变大小?

谢谢你的任何想法

jay*_*ngh 7

你可以使用awk这个:

awk 'BEGIN {print "GB FREE\n--------"} NR>2{print $4}' INPUT_FILE
Run Code Online (Sandbox Code Playgroud)

说明:

  1. 我们使用awk's BEGIN语句来打印标题GB FREE and -------.这是因为输入文件中的标题在标题中有空格.这可以抛弃awk脚本.
  2. 其次,我们使用存储行号的awk's内置变量NR.由于我们不希望打印第1行和第2行,因此我们保持条件NR>2.这样awk将跳过前两行并从第3行开始打印.
  3. awk默认情况下,分隔符或字段分隔符是空间(一个或多个).由于您的文件有,我们不需要设置FS内置变量.由空格分隔的每个字段都成为一列,可以使用$和访问column number.既然你想要GB FREE4列,我们就做了print $4.
  4. 为了让更多的条件,比如只打印那些线column 1已经DISK_2我们添加另一种模式的语句.使用NR>2 && $1~/DISK_2/确保我们不打印第1行和第2行并查找其中column 1包含的行DISK_2并打印column 4这些行.

注意:如果您不关心标题部分,可以将此单行程缩短为以下(根据您的要求):

awk 'NR>2{print $4}' INPUT_FILE
Run Code Online (Sandbox Code Playgroud)

要么

awk 'NR>2 && $1~/DISK_2/{print $4}' INPUT_FILE
Run Code Online (Sandbox Code Playgroud)

测试:

[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
Run Code Online (Sandbox Code Playgroud)

要添加评论中所述的过滤条件:

[jaypal:~/Temp] awk 'BEGIN {print "GB FREE\n--------"} NR>2 && $1~/DISK_2/{print $4}' file
GB FREE
--------
1,051.43
Run Code Online (Sandbox Code Playgroud)