как заменить пробелы на строку "\ |" используя сед? - PullRequest
0 голосов
/ 13 января 2019

Я пытаюсь настроить список исключений для передачи в "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".

EDIT

Выходные данные монтирования:

/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

как указано ранее.

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Вы можете использовать одну команду 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.

0 голосов
/ 13 января 2019

Попробуйте добавить это:

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\|...

Кстати, в какой ты системе? - Кажется, он обрабатывает выходные данные монтирования \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 оставят трейлинг \|.

...