我试图查看/proc/mounts
并返回以某个前缀或基本目录开头的所有安装,例如。/run/media
。目前,一个前缀就可以了,但原则上,如果能够指定多个前缀就更好了。
grep -o /run/media /proc/mounts
仅返回/run/media
当前次数。如果正则表达式部分是/run/media[\S]*
(尝试匹配完整路径直到空格),它仍然返回与以前相同的结果。
最终我想输出所有使用文本前缀和引号格式化的匹配项,如下所示:
"fs:/run/media/user/device1" "fs:/run/media/user/device2"
ETC
答案1
foo () {
awk '{ print $2 }' /proc/mounts |
while read -r mountpoint; do
for pattern do
if [[ $mountpoint == $pattern ]]; then
printf '%s:\t%s\n' "$pattern" "$mountpoint"
break
fi
done
done
}
此bash
函数解析出第二列(安装点),/proc/mounts
然后继续将每个给定参数作为 shell 模式与每个安装点进行比较。对于每个匹配,都会打印模式匹配和安装点,并考虑下一个安装点。通过更改命令可以轻松更改输出格式printf
。
在我有权访问的 Ubuntu 系统上运行的示例(请注意,这些模式是文件名通配模式,并且包含通配字符的模式需要通过引用来保护免受 shell 影响)。
$ foo /sys '/sys/*' '*info*'
/sys: /sys
/sys/*: /sys/firmware/efi/efivars
/sys/*: /sys/fs/fuse/connections
/sys/*: /sys/fs/pstore
/sys/*: /sys/kernel/debug
/sys/*: /sys/kernel/debug/tracing
/sys/*: /sys/kernel/security
*info*: /proc/cpuinfo
*info*: /proc/meminfo
/sys/*: /sys/fs/cgroup
/sys/*: /sys/fs/cgroup/systemd
/sys/*: /sys/fs/cgroup/perf_event
/sys/*: /sys/fs/cgroup/cpu,cpuacct
/sys/*: /sys/fs/cgroup/hugetlb
/sys/*: /sys/fs/cgroup/freezer
/sys/*: /sys/fs/cgroup/blkio
/sys/*: /sys/fs/cgroup/cpuset
/sys/*: /sys/fs/cgroup/pids
/sys/*: /sys/fs/cgroup/net_cls,net_prio
/sys/*: /sys/fs/cgroup/memory
/sys/*: /sys/fs/cgroup/devices
我选择在函数中使用 shell 循环来读取awk
程序的输出,而不是在程序本身中进行匹配awk
(这通常是我会做的)。我这样做是因为我想要一种简单的方法来迭代模式并==
在bash
.
顺便说一句,如果您想使用扩展正则表达式,只需将==
函数中的 更改为=~
,但请记住,您必须使用 和 来锚定表达式^
以$
匹配具体的路径(如 中^/sys$
),否则表达式将匹配路径名中的任何位置。
答案2
这是您的替代方案。我的awk
技能刚刚起步,如果您能提供有关如何改进此处所示用法的反馈,我将不胜感激。
show_mount_prefix() {
# $1 is a directory prefix. Display all current mounts that have that prefix.
printf '"%s" ' $(mount | awk -v prefix=" on ${1}[/ ]" '$0~prefix {print $3}')
printf '\n'
}
不带参数时,show_mount_prefix()
显示所有挂载点 [添加换行符以提高可读性]:
$ show_mount_prefix
"/sys" "/proc" "/dev" "/dev/pts" "/run" "/" "/sys/kernel/security"
"/dev/shm" "/run/lock" "/sys/fs/cgroup" "/sys/fs/cgroup/unified"
"/sys/fs/cgroup/systemd" "/sys/fs/pstore" "/sys/fs/cgroup/perf_event"
"/sys/fs/cgroup/memory" "/sys/fs/cgroup/cpu,cpuacct" "/sys/fs/cgroup/pids"
"/sys/fs/cgroup/devices" "/sys/fs/cgroup/freezer" "/sys/fs/cgroup/blkio"
"/sys/fs/cgroup/rdma" "/sys/fs/cgroup/cpuset" "/sys/fs/cgroup/net_cls,net_prio"
"/sys/fs/cgroup/hugetlb" "/dev/mqueue" "/sys/kernel/debug"
"/proc/sys/fs/binfmt_misc" "/dev/hugepages" "/sys/kernel/debug/tracing"
"/sys/fs/fuse/connections" "/sys/kernel/config" "/snap/core/7270"
"/snap/core/7396" "/data" "/var/lib/lxcfs" "/run/user/370880" "/run/user/0"
有一个论点:
$ show_mount_prefix /dev
"/dev" "/dev/pts" "/dev/shm" "/dev/mqueue" "/dev/hugepages"
遗憾的是,该算法不能直观地处理参数/
,该参数可能会列出所有安装,与无参数情况相同。曾经确实如此,但[/ ]
在图案中添加原子awk
打破了这一点。鉴于 OP 不想/d
匹配/dev
等,该原子是必要的/data
。