grep
соответствует строкам ввода. Если вы хотите сопоставить несколько строк, используйте другую утилиту. Например, используйте pcregrep
:
pcregrep -M "T12345 .{1,100}[\n\r].{1,100}2014.03.04" filename
Это даст:
31/01/2014 11:15:40 | Bla Bla Bla Bla T12345 Bla Bla Bla
31/01/2014 11:15:40 | Bla Bla Bla 2014/03/04 Bla Bla Bla
для вашего ввода.
Команда printf
использует свой первый аргумент в качестве формата для вывода последующих аргументов. printf %100s
выводит свои аргументы, дополненные до 100 символов шириной, используя пробелы (слева ). Для форматирования не предоставляется аргумент, поэтому он форматирует пустую строку один раз и выводит 100 пробелов. Вы можете видеть, что:
$ printf %100s | hexdump -C
00000000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
*
00000064
(20 — шестнадцатеричный пробел; *
означает повторение предыдущей строки)
В строках формата используются приблизительно спецификаторы C Xprintf
:%
, необязательная ширина для размещения отформатированного значения,и тип используемого формата. s
— это форматирование строки, и строки по умолчанию дополняются пробелами слева. Может быть несколько форматов или других буквальных частей:printf "a%10sb\n" hello
отпечатков
a xb.
tr
заменяет выбранные символы в стандартном вводе выбранными заменами и выводит результат на стандартный вывод. tr " " "="
содержит один символ для замены -пробелом -и один символ для замены на -знак равенства. Таким образом, он превращает каждый пробел во входных данных в =
, а остальные оставляет без изменений. Вы тоже можете попробовать:
$ tr " " "="
hello world
hello=world
(Я набрал "привет, мир")
У вас может быть несколько замен:tr abc def
превращает a в d, b в e, c в f, а остальное оставляет без изменений. Здесь это всего лишь один символ, так как printf
мог дешево сгенерировать именно его.
Конвейер |
вызывает вывод команды слева, printf %100s
, для использования в качестве ввода команды справа, tr " " "="
. То есть в tr
дается сто последовательных пробелов, и каждый из них заменяется на =
, при этом выводится новая строка.
printf %100s | tr " " "="
====================================================================================================
Короче говоря, printf %100s
напечатает 100 пробелов, а tr " " "="
преобразует эти пробелы в знаки равенства, фактически напечатав 100 знаков равенства.
Разрушение:
printf
— это оболочка, встроенная в -. Обычно она принимает два или более аргумента, первый из которых является «строкой формата», а остальные будут использоваться для заполнения заполнителей в этой строке формата. Как только этот шаблон будет полностью заполнен, он распечатает результат. Если осталось больше аргументов, он начнет сначала, заполнив дополнительные аргументы и распечатав результирующую строку.
Строка формата, используемая для printf
, принимает спецификации формата, которые начинаются с %
и заканчиваются одной буквой, поэтому %d
означает целое число (с использованием десятичной системы счисления, поэтому "d" ), %f
означает число с плавающей запятой -, а %s
означает строку символов. Символы, отличные от букв после %
, являются модификаторами спецификации формата, и, в частности, числа используются для указания требуемой длины поля на выходе. Таким образом, %100s
отформатирует строку так, чтобы она содержала не менее 100 символов, дополнит ее пробелами и сохранит правильное выравнивание (, другими словами, добавит пробелы в начале строки.)
Если передать дополнительный аргумент, он будет использовать его для этого поля %s
, поэтому, например, printf %100s abc
будет печатать 97 пробелов (, чтобы получить общее количество 100, учитывая 3 в "abc" ), за которыми следует фактической строкой "abc". Но если аргумент не указан, то спецификация формата заполняется пустым или нулевым аргументом (, который является пустой строкой для %s
, это будет 0 для %d
и т. д. )То же самое как если бы была передана пустая строка, например printf %100s ''
. Конечным результатом является то, что печатается только заполнение из 100 символов.
Таким образом, если сложить все вместе, printf %100s
будет напечатано 100 пробелов.
Теперь tr
— это инструмент для перевода символов из ввода в вывод. Он принимает два аргумента, SET1 и SET2, каждый из которых является набором символов, а затем переводит первый символ SET1 в первый символ SET2, второй символ SET1 во второй символ SET2 и так далее. tr
считывает ввод из стандартного ввода и записывает его обратно в стандартный вывод (, поэтому он очень полезен в конвейерах, подобных приведенному выше.)tr
всегда переводит все вхождения этого символа в заданную строку.
Например, tr aeiou 12345
будет переводить гласные в нижнем регистре в числа от 1 до 5 в указанном порядке, поэтому слово «queueing» будет переведено, например, в «q52523ng». Вы также можете передать ему диапазоны символов, например tr a-z A-Z
, чтобы превратить любую строчную букву в соответствующую прописную.
Таким образом, tr " " "="
просто переводит пробелы в знаки равенства по всей строке. Первый пробел должен быть заключен в кавычки, чтобы его можно было распознать как аргумент. =
на самом деле не нужно цитировать, но это не повредит. tr " " =
сработало бы так же.
Собрав все вместе, выведите 100 пробелов, затем переведите каждый из них в знаки равенства.
Надеюсь, это объясняет это достаточно подробно, но если вы все еще что-то не понимаете, пожалуйста, оставьте комментарий, и я постараюсь решить эту проблему.