【问题标题】:bashscript extract info from custom rowbash脚本从自定义行中提取信息
【发布时间】:2016-10-30 17:03:32
【问题描述】:

在命令下:gpart show

i get the output 
=>      34  31457213  ada0  GPT  (15G)
        34       128     1  freebsd-boot  (64k)
       162  29360000     2  freebsd-ufs  (14G)
  29360162   1572864     3  freebsd-swap  (768M)
  30933026    524221        - free -  (10GB)

我怎样才能从第三行提取 14G,从最后一行提取 10GB?

14/10GB 的值永远不会相同,这让我的工作更加困难。

我设法得到一些结果使用

猫测试 | sed 's/\|/ /' | awk '{打印 $6}{打印 $5}' 但我仍然需要提取这些信息,

有什么想法吗?请多谢。

【问题讨论】:

  • :gpart 显示 |awk 'NR == 3 || NR == 5 { print $NF} ' |sed "s/(//;s/)//"
  • 如果你特别想要 freebsd-ufs 分区,你应该过滤它而不是希望它总是第 3 行...

标签: linux bash shell awk sed


【解决方案1】:

awk:

awk -F '[()]' 'NR==3 {print $(NF-1)} END{print $(NF-1)}' file.txt
  • -F '[()]' 将字段分隔符设置为()

  • NR==3 {print $(NF-1)} 打印第三行所需的字段

  • END{print $(NF-1)} 打印最后一行所需的字段

示例:

% cat file.txt
    34  31457213  ada0  GPT  (15G)
        34       128     1  freebsd-boot  (64k)
       162  29360000     2  freebsd-ufs  (14G)
  29360162   1572864     3  freebsd-swap  (768M)
  30933026    524221        - free -  (10GB)

% awk -F '[()]' 'NR==3 {print $(NF-1)} END{print $(NF-1)}' file.txt
14G
10GB

【讨论】:

    【解决方案2】:

    您可以尝试以下解决方案 -

    vipin@kali:~$ cat kk.txt
         34  31457213  ada0  GPT  (15G)
            34       128     1  freebsd-boot  (64k)
           162  29360000     2  freebsd-ufs  (14G)
      29360162   1572864     3  freebsd-swap  (768M)
      30933026    524221        - free -  (10GB)
       vipin@kali:~$ awk -F'\(|\)' 'NR==3 || NR==5 {print $(NF -1)}' kk.txt
    14G
    10GB
    

    解释——

    使用转义字符\()| 用于多个字段分隔符,NR 选择多行,NF-1() 是字段分隔符时打印最后一列。

    【讨论】:

      【解决方案3】:
      $ cat file 
            34  31457213  ada0  GPT  (15G)
              34       128     1  freebsd-boot  (64k)
             162  29360000     2  freebsd-ufs  (14G)
        29360162   1572864     3  freebsd-swap  (768M)
        30933026    524221        - free -  (10GB)
      $ egrep -o '\([0-9]+\w+\)$' file | sed -n '3p;5p'
      (14G)
      (10GB)
      

      匹配正则表达式 '\([0-9]+\w+\)$' 即 1 个或多个数字后跟 1 个或多个单词字符,都包含在圆括号中并使用 sed 打印第 3 行和第 5 行

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-26
        • 1970-01-01
        • 2015-08-18
        • 2012-07-02
        • 2016-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多