我试图建立一个排除列表,以通过外壳变量传递给“ grep -v”,该变量由安装点组成,其中除去了初始的“ /”,并用空格分隔。我正在这样构建它:
EXCLUDE_LIST=$(mount | grep -v '/dev/' | awk '{ print $3 }' | sed 's,^[^/]*/,,' )
这将产生字符串“ dev proc sys tmp var / run”。这是我要用'\ |'替换空格的字符串因此“ grep -v”可以使用它。
我尝试添加
sed 's/ /\|/g'
到上一个管道,然后
sed 's/ /\\|/g'
和
sed 's/ /\\\|/g'
我想要的是“ dev \ | proc \ | sys \ | tmp \ | var / run”,但是我总是得到“ dev proc sys tmp var / run”。
编辑
mount的输出是
/dev/sda1 on / type ext4 (rw,reltime,nobarrier,commit=10)
devtmpfs on /dev type devtmpfs (rw,nosuid,relatime,sync,size=1024k,nr_inodes=502793,mode=755)
devpts on /dev/pts type devpts (rw,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /dev/shm type tmpfs (rw,relatime,sync,size=1024k)
procfs on /proc type procfs (rw,nosuid,nodev,noexec,relatime)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /tmp type tmpfs (rw,relatime,sync,size=524288k)
tmpfs on /var/run type tmpfs (rw,relatime,sync,size=131072k)
“ mount | grep -v'/ dev /'”的输出为:
devtmpfs on /dev type devtmpfs (rw,nosuid,relatime,sync,size=1024k,nr_inodes=502793,mode=755)
procfs on /proc type procfs (rw,nosuid,nodev,noexec,relatime)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /tmp type tmpfs (rw,relatime,sync,size=524288k)
tmpfs on /var/run type tmpfs (rw,relatime,sync,size=131072k)
“ mount | grep -v'/ dev /'| awk {print $ 3}”的输出为:
/dev
/proc
/sys
/tmp
/var/run
最后,“ mount | grep -v'/ dev /'| awk {print $ 3} | sed's,^ [^ /] * / ,,'”的输出为
dev proc sys tmp var/run
如前所述。
答案 0 :(得分:2)
您可以使用单个awk
命令:
mount | awk '!/\/dev\//{sub("/",d,$3);print $3;d="\\|"}' ORS=''
使用给定的mount
输入,它将打印
dev\|proc\|sys\|tmp\|var/run
说明:
# Applies to all lines with does not match /dev
!/\/dev/{
# Remove leading / with delimiter d
# d will be empty upon first use
sub("/","",$3)
# Print the column
print $3
# Set delimiter after first usage
d="\\|"
}
ORS=''
将使awk的输出记录定界符静音。
答案 1 :(得分:0)
尝试附加此内容:
awk -v RS="" '{gsub(/[\r\n]+/,"\\|")}1'
也就是说:
mount | grep -v '/dev/' | awk '{ print $3 }' | sed 's,^[^/]*/,,' | awk -v RS="" '{gsub(/[\r\n]+/,"\\|")}1'
#=> sys\|proc\|dev\|sys/kernel/security\|run\|sys/fs/cgroup\|sys/fs/cgroup/systemd\|...
顺便说一句,您正在使用什么系统? -似乎将mount的输出\n
换行符视为空格。
-还是仅仅是您的输入错误?
通常,您的一系列命令会产生:
sys
proc
dev
sys/kernel/security
run
...
但是您说这是一个用空格分隔的字符串,所以我最好的猜测是您的系统/编辑器将\n
显示为空格,这使您误认为它们是空格。
如果我猜错了,请纠正我。
犯了一个错误,只是修复了。
而且我也不相信sed
会自行将行尾更改为空格...
好玩,也尝试了awk
的方式:
mount | awk -v ORS="\\\|" '$0!~"/dev/"{print gensub("^/","",1,$3)}'
#=> sys\|proc\|dev\|sys/kernel/security\|run\|sys/fs/cgroup\|sys/fs/cgroup/systemd\|...
再次取乐:
mount| awk '!(FNR%2) && !/dev\/|^$/' RS="on /| type " ORS="\\\|"
awk
都将留下尾随\|
。