Unix / Linux Перенаправление и конвейер - PullRequest
0 голосов
/ 22 сентября 2018

Я выполняю упражнение из книги «Ваше окончательное руководство по Unix / Linux», пытаясь лучше всего изучить командную строку, на этот вопрос я не смог ответить, подумав об этом около 45 минут, и решение не дано вкнига, вот вопрос:

Предположим, есть файл журнала доступа с именем "access.log" (одна запись на строку), фильтр "userfilter", который выводит только строки в журнале доступаформат, соответствующий записям для пользователя, «roomfilter», который выводит только строки в формате журнала доступа, соответствующего записям для комнаты, и «codefilter», который выводит только строки в формате журнала доступа, соответствующем одной из «записей», «выход "или" отказано ".Все фильтры принимают один аргумент, чтобы указать значение для вывода.Дайте команду, чтобы показать, сколько раз "Уинстон" входил в комнату "101"

любая помощь в правильном направлении будет оценена, спасибо

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018
cat access.log | userfilter winston | wc -l >> file.name

вы можете передать результат в новый файл.

0 голосов
/ 22 сентября 2018

В терминологии Unix фильтр - это то, что получает строки текста откуда-то, модифицирует их одну за другой и выводит их.В этом контексте «изменить» также может означать «съесть / выбросить».

Обычно вы используете фильтр, наполняя его данными;например:

cat access.log | userfilter fred

запустит две команды: «cat access.log» берет файл (access.log) и отправляет его.Команда «userfilter fred» запускает второй процесс, который принимает строки текста, но выводит только те, которые соответствуют критериям user = fred.Волшебство совершается символом канала |, который запускает две команды и соединяет выход первого с входом второго.

«кот», если не сказано иначе, выводит данные на консоль (хорошодействительно есть "стандартный вывод").«userfilter» не отличается - если не сказать иначе, отправляет данные в стандартный вывод.На самом деле все эти команды («фильтры») будут всегда отправлять данные на стандартный вывод (это unix-способ): это оболочка, которая манипулирует каналами и соединяет их.Но я хотел добавить «если не сказано по-другому», потому что есть команды, которым можно сказать, что они ведут себя по-разному.

Теперь вы можете взять вывод последней команды и отправить его куда-нибудь еще, угадайте, как?Добавляя все больше и больше каналов "|".

Я полагаю, вы бы запустили свою командную строку следующим образом:

cat access.log | userfilter winston | roomfilter 101

В приведенной выше команде все все строки из access.log идутчерез пользовательский фильтр, который выводит только те, в которых есть пользователь winston.В свою очередь, эти результирующие строки идут в roomfilter, который выводит только те, в которых есть комната 101. В результате получается, что вся активность winston в комнате 101 выводится.

Я оставляю вам последний шаг фильтра, но я будупомочь вам в подсчете результатов.

Предположим, что вас больше не интересуют конечные (релевантные) строки журнала, но при подсчете их в Unix есть хороший "стандартный" фильтр, который делает именно это: count (он может считать строки, символы, слова).Его зовут "wc" или, говоря обычным языком Unix, wc(1).Это «1» означает, что это обычная команда, и вы можете прочитать объяснения (руководство) об этом с помощью команды man wc.Хорошо, не правда ли?Кроме того, wc не означает уборную - это означает «подсчет слов».

Чтобы подсчитать, сколько строк текста представлено в нем, правильный синтаксис - «wc -l».Таким образом, вы можете подсчитать, сколько строк в файле access.log, используя эту команду:

cat access.log | wc -l

Если вы хотите подсчитать, сколько раз Winston что-то делал, вы используете:

cat access.log | userfilter winston | wc -l

Я не дал вам полный ответ, просто несколько кирпичиков, чтобы построить его самостоятельно;Надеюсь, этого достаточно - удачи!

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