微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 awk 和 grep 获取挂载点

如何解决使用 awk 和 grep 获取挂载点

我正在尝试在 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 列,而第二行的 /mnt 位于第 5 列,所以我该如何获取 mount -v | grep mnt | awk '{ print $1'} 部分

{{1}} 为我获取路径,但如何获取挂载点。

解决方法

对于这个特定的输出,这样的事情会起作用;请记住,如果您使用的任何带空格的路径中包含“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:如果您不在路径中使用空格,将它们替换为 ._,或者驼峰命名法,那么您的情况会好多了。 .

,

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

$ 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 是多余的,因为它匹配输入的每一行,并且通常 grepawk(几乎)总是冗余的。如果您需要添加过滤器,请使用 awk 并使用:

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

这行得通吗?

mount -v | grep mnt | awk '{ print $(NF-3)";"$1 }' 
,

如果您感兴趣的字段是 #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/'

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。