2

у меня есть файлы журналов в текущей структуре:

STDAT #668324
CSPEC
--Visitor--
IP2LOC:N/A
Time:0900
DOW:1
OS:Windows NT 5.1
Browser:Firefox 3.5
IP:128.64.55.129

я знаю, что Linux, вероятно, является королем инструмента командной строки, так что это инструмент, такой как "getlines" или что-то еще, чтобы я мог извлечь строки из текстового файла? единственные строки, которые мне нужны, это "OS" и "Browser", и я хочу добавить их все в один текстовый файл для построения графиков. Какую команду я могу использовать, чтобы взять эти 2 строки из этого файла TXT? У меня есть тысячи таких файлов с моего сайта, которые созданы PHP, но поскольку сайт стал больше, я буду использовать базу данных, но я не хочу, чтобы эти файлы терялись, так как эта информация все еще полезна.

5 ответов5

6

Это должно просто вернуть строки OS и Browser из файла:

egrep '(OS|Browser)' filename

Если у вас много файлов журналов, вы можете использовать *

egrep '(OS|Browser)' /path/to/logs/*

Вы можете перенаправить этот вывод в новый файл журнала

egrep '(OS|Browser)' /path/to/logs/* > summary.log

Если вы хотите удалить OS: и Browser: с начала каждой строки, вы можете использовать awk

egrep '(OS|Browser)' /path/to/logs/* | awk -F: '{print $2}' > summary.log
2

theotherreceive очень хорошо объяснил решение.

Просто одна вещь, чтобы добавить,
Если вы подозреваете, что термины « OS или « Browser могут встречаться в другом месте текста вашего файла журнала,

egrep '(^OS:|^Browser:)' filename
        -  - -       -   # Note: extra parts for catching your keys better

поможет вам проверить это.
Это предполагает, что два термина появляются в начале строки и сопровождаются символом « : » .
Остальное, как уже описано в этом ответе.

1

Допустим, все ваши файлы находятся в одном каталоге, например: /var /www /html /logs и его подкаталог. Давайте предположим, что все файлы журнала заканчиваются на «.log». Предположим, что вы хотите объединенный журнал в /home/username/combinedlog.txt

Существует Unix-инструмент под названием "find", который ищет файлы в данном дереве каталогов, например

find /var/www/html/logs -name '*.log' -type f -print

будет печатать имена всех файлов, заканчивающихся на «.log», из каталога /var /www /html /logs и его подкаталогов.

Как показывают предыдущие ответы, вы можете получить только ОС с «grep OS:| tail -c +4» и только браузер с «grep OS:| tail -c +4». Первый ответ также показывает, как сделать цикл for с результатами одной команды. Таким образом, объединенный ответ будет:

for i in `find /var/www/html/logs -name '*.log' -type f -print`; do 
  grep "OS:" $i |tail -c +4 >> /home/username/combinedlog.txt; 
  grep "Browser:" $i|tail -c +9 >> /home/username/combinedlog.txt; 
done;

И это будет проходить через все файлы одновременно. Обратите внимание, что «>>» добавляется к файлу, если вы запустите это снова, не удаляя предыдущий объединенный файл журнала, вы продублируете содержимое!

Редактировать: или вы можете использовать egrep + awk из предыдущего ответа и заменить два greps одним egrep + awk. Вы также можете использовать "cut" вместо "tail" или "awk".

1

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

egrep '(OS|Browser)' /path/to/logs/* | sort | uniq -c

Передача результатов через sort и uniq -c подсчитает, сколько раз каждый браузер или операционная система будет отображать результаты.

0

Вы должны уметь использовать магические способности grep и tail !

Чтобы вернуть браузер:

 cat file.txt | grep Browser: | tail -c +9

Чтобы вернуть ОС:

cat file.txt | grep OS: | tail -c +4

Если вы хотите записать их в текстовый файл, это должно работать:

 cat file.txt | grep OS: >> results.txt && cat file.txt | grep Browser: >> results.txt

Возможно, есть и другие решения, но я не такой уж изящный в Bash и тому подобное, так что это лучшее, что я придумал.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .