【问题标题】:Getting Mount Points using awk & grep使用 awk 和 grep 获取挂载点
【发布时间】:2021-09-29 08:17:37
【问题描述】:

我正在尝试在 linux 上获取挂载点及其各自的路径。所以当我运行mount -v 命令时,我得到了这个示例输出

//cifst/FSR on /mnt/share/cifst/FSR type cifs ...
//sydatsttbsq01/TheBooks statements to be parsed on /mnt/share/TheBooks type cifs ...

我正在尝试解析此文本以显示此输出

/mnt/share/cifst/FSR;//cifst/FSR
/mnt/share/TheBooks;//sydatsttbsq01/TheBooks

但是第一行的/mnt 在第 3 列,而第二行的在第 5 列,那么我该怎么做才能获得 /mnt 部分

mount -v | grep mnt | awk '{ print $1'} 为我提供了路径,但我如何获得挂载点。

【问题讨论】:

  • 不要使用带空格的路径?
  • 什么意思?
  • 共享名TheBooks statements to be parsed ...
  • 你可以试试这个而不是 mount 命令吗? df -h | awk '{ print $NF";"$1}'

标签: parsing awk command-line windows-subsystem-for-linux mount-point


【解决方案1】:

很多假设,但这适用于您的示例输入/输出:

$ cat << EOF | awk '{print $(NF-2), $1}' OFS=\;
> //cifst/FSR on /mnt/share/cifst/FSR type cifs
> //sydatsttbsq01/TheBooks statements to be parsed on /mnt/share/TheBooks type cifs
> EOF
/mnt/share/cifst/FSR;//cifst/FSR
/mnt/share/TheBooks;//sydatsttbsq01/TheBooks

诀窍是注意不是您感兴趣的第 3 列和第 5 列,而是在每种情况下都是 NF - 2 列。

在这种特殊情况下,grep 是冗余的,因为它匹配输入的每一行,通常grep(几乎)总是与awk 冗余。如果您需要添加过滤器,请使用 awk 并使用:

awk '/mnt/{print $(NF-2), $1}' OFS=\;

【讨论】:

  • 我更新了问题中的输出。每行type cifs 后面都有一长行文字。我用 ... 来表示。所以你的建议行不通。
【解决方案2】:

如果您感兴趣的字段是#1,并且第一个字段之后的下一个等于“on”,并且它们不包含空格,您可以试试这个:

mount -v | awk '{a="";for(i=2;i<=NF;i++){if(a=="on")break;a=$i};print $i";"$1}'

如果我们再添加一个假设,即只有一个字段等于“on”,另一种可能性是使用gensub

mount -v | awk '{print gensub(/^(\S+).*\<on\>\s+(\S+).*/,"\\2;\\1",1)}'

这给我们带来了一个 sed 等价物:

mount -v | sed -r 's/^(\S+).*\<on\>\s+(\S+).*/\2;\1/'

【讨论】:

    【解决方案3】:

    对于这个特定的输出,这样的事情会起作用;请记住,如果您使用的任何带空格的路径中包含“on”一词,它将中断。

    mount -v | awk 'BEGIN{FS="( on | type )"; OFS=";"} $3 ~ /cifs/ {print $2,$1}'
    /mnt/share/cifst/FSR;//cifst/FSR
    /mnt/share/TheBooks;//sydatsttbsq01/TheBooks statements to be parsed
    

    PS:如果你不在路径中使用空格,你会好多更好,将它们替换为.,或_,或驼峰式它们......

    【讨论】:

    • 那么您上面的示例输出与您系统上的输出不匹配。
    • 是的,我愿意。我刚刚在我的电脑上运行它。要么你有不同版本的 awk 或其他东西。同样对于路径,它只是 //sydatsttbsq01/TheBooks 之后的位不是路径的一部分。
    • 路径的一部分,否则它不会出现在“on”之前。它当然不是 mount 输出的一部分。至于 awk - 您使用的是什么版本?我正在使用gawk 5.0.1
    • 我正在使用 GNU Awk 5.0.1
    • 同样的 awk 然后......你运行的是什么 Linux 版本?
    猜你喜欢
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 2017-10-13
    • 2017-07-15
    • 1970-01-01
    相关资源
    最近更新 更多