2010-02-08 6 views
3

Я пытаюсь извлечь год из этого вывода:основы использования вырезать AWK Grep и СЭД

[email protected]:~/shell$ date 
Mon Feb 8 21:57:00 CET 2010 

[email protected]:~/shell$ date | cut -d' ' -f7 
2010 

[email protected]:~/shell$ date | awk '{print $6}' 
2010 

Есть ли другие способы, чтобы получить тот же результат? используя, возможно, grep, sed и т. д.? Merci!

ответ

2

Некоторые sed вариации:

date | sed 's/.* //' 

date | sed 's/.*\(....\)$/\1/' 

date | sed 's/.*\(.\{4\}\)$/\1/' 

date | sed -r 's/.*(.{4})$/\1/' 

date | sed -r 's/.*([[:digit:]]{4})$/\1/' 
+0

потрясающий! спасибо Dennis – Zenet

1

Grep предназначен для печати всей строки, соответствующей RE. Получение его для распечатки только части строки будет относительно сложно (в лучшем случае).

С помощью sed вы можете использовать RE, который соответствовал остальной части линии, и заменить его ничем, оставив часть, о которой вы заботитесь.

+0

Ну, получая GNU Grep, чтобы распечатать только часть строки не сложно. Попробуйте флаг -o (--only-matching). –

+0

@Philip: Спасибо - я не заметил этого флага (хотя я, вероятно, видел текст справки для него несколько сотен раз) –

10

Если вы действительно ищете только текущий год от date, вы можете подумать, что это просто работает.

date +%Y 

Никакой последующей обработки не требуется. :)


Update: Комментарии обработки текста (так как OP ищет тех)

cut/awk/sed велики для растаскивания строк текста. grep подходит для поиска нужных вам линий.

Более неясными (и менее портативными) являются bash-specific regexp-like operators, но они могут быть быстрыми и интересными в использовании.

$ MYDATE=`date` 
$ echo $MYDATE 
Mon Feb 8 16:28:04 EST 2010 
$ echo ${MYDATE##* } 
2010 
+0

Я просто набрал этот точный ответ, когда вы его разместили. Единственное, что я добавил бы, это прочитать страницы руководства для получения дополнительных параметров форматирования. Фактически, я бы сказал, что у nour теперь есть «мандат», чтобы читать страницы руководства. – mmrobins

+0

Спасибо :) Я просто пытаюсь изучить различные применения команд bash ... – Zenet

+2

'$()' проще в использовании и менее подвержен ошибкам, чем обратные ссылки (рассмотрим кавычки и экранирование). – 2010-02-09 08:29:13

1

Возможно, вы захотите зарегистрироваться Perl. Он значительно поднимается с sed и с точки зрения синтаксиса и представляет собой полный язык программирования, с библиотекой огромной библиотекой (CPAN), которая поможет вам интегрироваться с различными системами.

Я перешел на Perl, когда обнаружил, что мои простые решения должны были выходить за пределы простейших случаев.

+0

И многие другие языки сценариев оболочки (которые просто означают, что вы можете использовать линию shebang) работают хорошо по тем же причинам. – 2010-02-09 08:30:16

+0

Это очень верно. Я предпочитаю perl, но я готов принять это по историческим причинам, и сегодня я могу выбрать ruby ​​/ python и т. Д. –

1

Grep находит образцы в ваших файлах. Однако он не будет изменять ваши файлы. sed находит шаблоны, а также выполняет модификацию ваших файлов. cut - это инструмент для «вырезания» столбцов в ваших файлах для отображения/(или для файла). Используйте его, если ваша задача очень проста, просто введите несколько столбцов. awk находит шаблоны в вашем файле, и вы можете внести в него изменения, создав другой файл. И awk делает то, что делает sed, grep, cut, поэтому вы можете делать с ним всего лишь 1 инструмент.

Для файлов большого размера используйте grep, чтобы найти шаблон и pipe для awk/sed для обработки текста.

для вашего примера, если вы хотите получить команду года date, используйте date +%Y.

различные способы, чтобы получить ГОД date команды

$ date +%Y 
2010 

$ date | awk '{print $NF}' 
2010 

$ var=$(date) 
$ set -- $var 
$ eval echo \${${#}} 
2010 

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

1

С GNU grep вы можете использовать -o (--only-matching), чтобы отображать только часть соответствующей строки, которая соответствует шаблону. Ниже шаблон является регулярным выражением Perl (-P, --perl-регулярное выражение) для четырех цифр подряд:

$ date | grep -oP '\d{4}' 
2010 
+0

Очень круто Филипп, спасибо! – Zenet

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