2013-02-25 3 views
3

У меня есть скрипт, названный foo.sh, который содержит что-то вродеБаш - синтаксический анализ списка аргументов в файле

exec myapp -o size=100m -f 

Любая идея, как создать другой сценарий, который разбирает foo.sh и извлекает значение size? Можно предположить, MyApp появляется только один раз в foo.sh, но порядок size аргумента может появиться в любом месте в списке аргументов

Благодарности

ответ

0
cat foo.sh | egrep -o 'size=[[:digit:]]+' | awk -F= '{print $2}' 
+0

это почти работает. Я надеялся получить все между «size =» и следующим пробелом – user2077092

+0

'cat | grep | awk' - бесполезное использование cat & grep. http://partmaps.org/era/unix/award.html#cat –

2

С в оболочке:

$ grep -oP 'myapp.*?size=\K\d+m' foo.sh 
100m 

С в оболочке:

$ awk -F'size=' '{sub(/ -f/, "");print $2}' foo.sh 
100m 

или

$ awk '{print gensub(/.*size=([0-9]+m).*/, "\\1", $0)}' foo.sh 
100m 

С в оболочке:

$ perl -lne 'print $1 if /exec.*?size=(\d+m)/' foo.sh 
100m 

Или с помощью оболочки смешной трюк:

$ declare $(grep -oP "\b\w+=\w+\b" foo.sh) 
$ echo $size 
100m 
+1

+1 Искал этот непослушный '\ K' на некоторое время! – Rubens

+0

это тоже работает! – user2077092

+0

Несомненно, без сомнения =) –

0

вариация на SED подхода. Это одно короткое замыкание, как только оно будет найдено. Полезно, если файл очень длинный, и цель, вероятно, близка к началу.

sed -ne '/exec myapp -o size=/{s/[^0-9]*\([m0-9]*\).*/\1/;p;q;}' 

После того, как он находит правильную линию, он извлекает значение размера, печатает его, а затем завершает работу.

Смежные вопросы