основы использования вырезать awk grep и sed - PullRequest
3 голосов
/ 09 февраля 2010

Я пытаюсь извлечь год из этого вывода:

sam@sam-laptop:~/shell$ date
Mon Feb  8 21:57:00 CET 2010

sam@sam-laptop:~/shell$ date | cut -d' ' -f7
2010

sam@sam-laptop:~/shell$ date | awk '{print $6}'
2010

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

Ответы [ 6 ]

10 голосов
/ 09 февраля 2010

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

date +%Y

Не требуется постобработка. :)


Обновление: Комментарии к обработке текста (так как ОП ищет их)

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

Более непонятными (и менее переносимыми) являются операторы, похожие на регулярные выражения в стиле bash , но их можно использовать быстро и с удовольствием.

$ MYDATE=`date`
$ echo $MYDATE
Mon Feb 8 16:28:04 EST 2010
$ echo ${MYDATE##* }
2010
2 голосов
/ 09 февраля 2010

Некоторые 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/'
1 голос
/ 09 февраля 2010

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

$ date | grep -oP '\d{4}'
2010
1 голос
/ 09 февраля 2010

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

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

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

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

$ date +%Y
2010

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

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

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

1 голос
/ 09 февраля 2010

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

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

1 голос
/ 09 февраля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...