2012-08-31 7 views
0

Я запускаю команду в CentOS, которая дает мне вывод строки, и я хочу захватить определенную часть этого вывода и установить ее в переменную.Bash: захватить часть строки из вывода командной строки

Выполняю команду ebi-describe-env.

Мой выход следующим образом:

ApplicationName | CNAME | DATECreated | DateUpdated | Description | EndpointURL | 
EnvironmentID | EnvironmentName | Health | Stack | Status | TemplateName | 
Version Label -------------------------- 
Web App | domain.com | 2012-02-23 | 2012-08-31 | | 
anotherdomain.com | e-8sgkf3eqbj | Web-App-Name | Status | 
Linux | Ready | N/A | 20120831 - daily 

Я хочу, чтобы захватить «20120831 - daily» часть строки (эта строка всегда будет меняться, но остается в том же месте) и установите его в переменной.

Первоначально я думал, что могу использовать grep или sed и распечатать строку после каждого '|' и установите 13-ю строку в переменную.

Я очень новичок в создании сценариев bash, поэтому любая помощь будет отличной. Спасибо.

+1

это все, как предполагается, на одной линии? – Neil

+1

Да, это должно быть на одной линии. –

ответ

9

Использование awk:

awk -F"|" '{print $NF}' 

это будет работать:

echo " Web App | domain.com | 2012-02-23 | 2012-08-31 | | anotherdomain.com | 
     e-8sgkf3eqbj | Web-App-Name | Status | Linux | Ready | N/A | 
     20120831 - daily" | awk -F"|" '{print $NF}' 

и выход:

20120831 - daily 

Чтобы присвоить переменной (data.txt содержит вашу строку только для простоты , он также работает echo выше):

$ myvar=$(awk -F"|" '{print $NF}' data.txt) 
$ echo $myvar 
20120831 - daily 

Объяснение

в -F устанавливает поле ввода разделителя, в данном случае к |. NF - это встроенная переменная awk, которая обозначает количество полей ввода, а $ перед переменной обращается к этому элементу, то есть в этом случае последнее поле в строке ($NF).

В качестве альтернативы: Вы могли бы захватить каждый из последних трех полей, разделенных пробелами (awk по умолчанию) с этим:

awk '{print $(NF-2), $(NF-1), $NF}' 
+0

@MichaelLe Обновлен ответ, чтобы показать назначение переменной оболочки – Levon

+0

Благодарим вас за объяснение и шаги. –

+0

@MichaelLe Счастлив, что смог помочь. – Levon

3

ответ Левона прекрасно работает, но я просто должен был показать, есть всегда другие способы с использованием сценариев оболочки.

Это один использует базовый инструмент под названием cut

echo "Web App | domain.com | 2012-02-23 | 2012-08-31 | | anotherdomain.com | e-8sgkf3eqbj | Web-App-Name | Status | Linux | Ready | N/A | 20120831 - daily" | cut -d"|" -f13 
+0

+1 Мне нравится :) – Levon

+0

Можете ли вы объяснить, что делает -f13? –

+0

Если у вас есть доступ к ящику Unix/Linux/* nix, потяните терминал и введите 'man cut'. Короче говоря, '-d" | "' указывает, что символ '|' разделяет поля, а часть '-f13' запрашивает 13-е поле. cut -d "|" -f13 –

1

Я знаю, что это было принято уже, но вот как это сделать в чистом Баш:

string="Web App | domain.com | 2012-02-23 | 2012-08-31 | | anotherdomain.com | e-8sgkf3eqbj | Web-App-Name | Status | Linux | Ready | N/A | 20120831 - daily" 
myvar="${string##*| }" 
echo "$myvar" 
+0

Есть ли причина избежать Awk в этом случае? Awk указан POSIX и предоставляется Busybox. Может быть, у небольших встроенных систем нет? Это не риторический вопрос. – ngks

+1

@ngks Нет, мне просто хотелось указать, что внутренние строковые конструкции bash соответствуют этой конкретной задаче. – Neil

+0

Прохладный, как @Levon сказал, что всегда есть другие способы. – ngks