2015-02-27 4 views
0

У меня есть переменная, которая хранит выходные данные файла. В этом выпуске я хотел бы напечатать первое слово после Database:. Я довольно новыми для регулярных выражений, но это то, что я пытался до сих пор:Bash print word after match

sed -n -e 's/^.*Database: //p' "$output" 

Когда я пытаюсь это, я получаю сообщение об ошибке sed: can't read prints_output: File name too long.

Принимает ли sed только имя файла? Я бегу улья запрос desc formatted table и сохранение результатов в output так:

output=`hive -S -e "desc formatted table"` 

output затем устанавливается в результате того, что:

... 
# Detailed Table Information 
Database:    sample_db 
Owner:     sample_owner 
CreateTime:    Thu Feb 26 23:36:43 PDT 2015 
LastAccessTime:   UNKNOWN 
Protect Mode:   None 
Retention:    0 
Location:    maprfs:/some/location 
Table Type:    EXTERNAL_TABLE 
Table Parameters: 
... 
+1

Сообщение об ошибке не имеет смысла без кода, который устанавливает '$ output' и способ, которым вы вызываете скрипт. На какой платформе вы работаете на этих 13 символах, слишком длинное имя файла? Даже ранние версии Unix поддерживали 14 символов в имени файла. Возможно, вам следует показать результат запуска 'bash -x your-script prints_output' или того, что вызывает вызов команды (параметр' -x' показывает, что Bash считает, что он делает, как он делает это, более или менее). –

+0

@JonathanLeffler, который может быть моей первой ошибкой. Я пытаюсь передать переменную 'sed', а не имя файла. Я обновил OP, чтобы лучше отразить то, что я пытаюсь сделать. – raphnguyen

ответ

2

Поверхностно, вы должны использовать:

hive -S -e "desc formatted table" | 
sed -n -e 's/^.*Database: //p' 

Это отобразит полную строку, содержащую Database:. Когда у вас это работает, вы также можете исключить нежелательный материал на линии.

В качестве альтернативы, вы можете использовать:

echo "$output" | 
sed -n -e 's/^.*Database: //p' 

Или, опять же, при условии, что вы используете Bash, вы можете использовать:

sed -n -e 's/^.*Database: //p' <<< "$output" 

Я бы использовать первый, если не нужен весь результат сохранен для повторного сканирования. Тогда я бы, вероятно, захватить вывод в файл (с tee):

hive -S -e "desc formatted table" | 
tee output.log | 
sed -n -e 's/^.*Database: //p' 
+0

Это работает отлично. Все еще изучайте все аспекты Bash. Почему вы предпочитаете сохранять весь вывод как файл, а не переменную? Я буду повторять сканирование вывода для дополнительных совпадений, поэтому, предполагая, что я использую 'tee' для генерации' output.log', как вы предположили, воспользуюсь ли я тогда 'sed -n -e '/^.* next_match // p 'output.log', чтобы найти мой следующий матч? – raphnguyen

+0

Если вы сохранили данные в файле, как показано на рисунке, то следующее сканирование действительно будет указывать 'output.log' в качестве входного файла. Я использую файлы, а не переменные, потому что я изучил скрипты на машине с массивным 1 мегабайтом памяти и до сих пор помню радость, вызванную, когда это удвоилось до 2 MiB, увеличив доступную пользовательскую память с 256 KiB до 1,25 MiB (в пять раз)! Другими словами, память не всегда была доступна для хранения больших значений. Также легче отлаживать, если данные записываются в файл; вы можете взглянуть легче, если он находится в файле (но вы должны очистить его потом). –

+0

Другими словами, вы опытный ветеринар. Спасибо за подсказку и краткую прогулку по истории. – raphnguyen

0

Попробуйте использовать: задать расширенное

egrep -oh 'Database:[[:blank:]][[:alnum:]]*[[:blank:]]' <output_file> | awk '{print $2;}' 
+0

Хотя это может ответить на вопрос, всегда полезно добавить текст в свой ответ, чтобы объяснить, что вы делаете.Прочитайте [как написать хороший ответ] (http://stackoverflow.com/help/how-to-answer). – jurgemaister

+0

спасибо @jurgemaister –