使用 grep/awk 命令从一行中 Grep 特定单词

使用 grep/awk 命令从一行中 Grep 特定单词

我尝试了这个命令:

# mount | grep -E '\s/dev/shm\s' | awk  -F "(" '{print $NF}'

期望:

rw,nosuid,nodev,seclabel

我得到了什么:

rw,nosuid,nodev,seclabel)

我也尝试过这个:

mount | grep -E '\s/dev/shm\s' | awk  -F "(" '{print $NF}' | cut -c -24
rw,nosuid,nodev,seclabel

我可以得到准确的单词,但默认情况下,任何一个单词不存在,它就不起作用,所以)最后我需要删除这个字符,有人知道吗?教我解决这个问题。

答案1

我猜测你的mount | grep命令的输出是这样的:

$ mount | grep -E '\s/dev/shm\s'
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,inode64)

因此,您想要的(再次,我在这里猜测)是包含的行中括号之间的文本/dev/shm。 如果是这样,请尝试:

$ mount | grep -oP '\s/dev/shm\s.+\(\K[^)]+'
rw,nosuid,nodev,inode64

-o选项指示grep仅打印行的匹配部分,并-P启用 PCRE(Perl 兼容正则表达式),这为我们提供了\K“忽略到目前为止匹配的所有内容”的功能。因此,正则表达式将查找/dev/shm由空格包围的字符,然后查找尽可能多的字符,直到左括号 ( .+\()。现在,由于 ,到此处的所有内容都被忽略,\K然后我们只匹配最长的非-)字符 ( [^)]+)。


如果由于某种原因您确实需要使用awk,则无需grep

$ mount | awk -F'[()]' '/\s\/dev\/shm\s/{print $(NF-1)}'
rw,nosuid,nodev,inode64

答案2

findmnt通常用于查找和显示设备名称、挂载或文件系统类型等详细信息。

findmnt -n --target /dev/shm --output=options

积极的坐骑位于/proc/mounts并且具有固定数量的列,这使得它很容易解析:

while read -r _ a _ b _; do
    [[ $a = /dev/shm ]] && echo $b
done < /proc/mounts

相关内容