Извлечение подстроки из строк на основе условия с командной строкой оболочки - PullRequest
0 голосов
/ 30 января 2020

У меня есть строки в myfile, например:

mount -t cifs //hostname/path/ /mount/path/ -o username='xxxx',password='xxxxx'

Мне нужно извлечь из этого подстроки, основываясь на условии «начать с // до следующего пробела, включая //» .

Я не могу разобрать позицию , так как она не будет одинаковой во всех совпадающих строках.

До сих пор я извлек подстроку с помощью perl утверждение grep, но результат не возвращает //.

Код, который я использовал:

cat myfile | grep " cifs " | grep -oP "(?<=/)[^\s]*" | grep -v ^/

Вывод:

hostname/path/

Ожидаемый результат:

//hostname/path/

Есть ли способ получить желаемый результат путем изменения регулярного выражения perl, возможно, каким-нибудь другим методом?

Ответы [ 3 ]

2 голосов
/ 30 января 2020

Простое bash решение в одну строку

grep " cifs " myfile | sed -e "s/ /\n/g" | grep '^\/\/' 
1 голос
/ 30 января 2020

Вы можете рассмотреть возможность использования некоторых решений, не основанных на PCRE, таких как

sed -En '/ cifs /{s,.*(//[^[:space:]]+).*,\1,p}' file
grep -oE '//[^[:space:]]+' file

. Решение grep просто извлекает все вхождения // и 1+ непробельных символов после file.

Решение sed находит строки, содержащие cifs , а затем извлекает последнее вхождение // и 1+ непробельных символов после этих строк.

0 голосов
/ 30 января 2020

Следующая команда должна делать то, что вы просите

grep cifs myfile | cut -d ' ' -f 4

или

grep cifs myfile | nawk '{print $4}'

или

awk '/cifs/ { print $4 }' myfile

или

perl -ne "print $1 if /cifs\s+(\S+)/" myfile

...