Чтение из файла bash Linux - PullRequest
0 голосов
/ 04 ноября 2019

Мне трудно работать со следующим сценарием bash:

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

мой скрипт такой:

#!/bin/bash

find . -name ".*log" | cat *.log |  sort --stable --reverse --key=2,3

когда я запускаю скрипт, он делаетвернуть список, но сортировка не работает должным образом. я думаю, потому что в некоторых файлах есть \ n, что заставляет его начать новую строку.

есть ли способ игнорировать \ n, которые есть в файле, в то же время возвращая каждую строку на новой строке?

спасибо! the output we should be getting current output result text that is inside the files

xxd Вывод команды:

ise @ ise-virtual-machine: ~ $ xxd /home/ise/Downloads/f1.log 00000000: 3230 3139 2d30 382d 3232 5431 333a 3333 2019-08-22T13: 33 00000010: 3a34 342e 3132 3334 3536 3738 3920 4865: 44.123456789 He 00000020: 6c6c 6f0a 576f 726640a 0032 3032 302d llo.World..2020- 00000030: 3031 2d30 3154 3131 3a32 323a 3333 2e31 01-01T11: 22: 33,1 00000040: 3233 3435 3637 3839 206c 6174 650a 23456789 поздно. ise @ ise-virtual-machine: ~ $ xxd /home/ise/Downloads/f2.log 00000000: 3230 3139 2d30 392d 3434 5431 333a 3434 2019-09-44T13: 44 00000010: 3a32 312e 3938 3736 3534 3332 3120 5369: 21,987654321Si 00000020: 6d70 6c65 206c 696e 650a mple line. ise @ ise-virtual-machine: ~ $ xxd /home/ise/Downloads/f3.log 00000000: 3230 3139 2d30 382d 3232 5431 333a 3333 2019-08-22T13: 33 00000010: 3a34 342e 3132 3334 3536 3738 3920 4865: 44.123456789Он 00000020: 6c6c 6f0a 576f 726c 6420 320a 0032 3032 llo.World 2..202 00000030: 302d 3031 2d30 3154 3131 3a32 323a 3333 0-01-01T11: 22: 33 00000040: 2e31 3233 3435 3637 3839 206c 6174 6520. 123456700000050: 320a 2.

Ответы [ 2 ]

3 голосов
/ 04 ноября 2019

Учитывая, что записи в файле журнала заканчиваются на \ 0 (NUL), find, sed и sort могут быть объединены:

find . -name '*.log' | xargs sed -z 's/\n//g' | sort -z --key=2,3 --reverse
1 голос
/ 05 ноября 2019

Предполагая, что каждая запись в файле начинается с даты, и опция --key=2,3 не требуется, пожалуйста, попробуйте:

find . -name "*.log" -exec cat '{}' \; | sort -z | xargs -I{} -0 echo "{}"

Последняя команда xargs .. echo .. потребуется для правильной печати нулевого значения-конечные строки.
Если вам все еще требуется опция --key, измените код, как вам нравится. Я не знаю, как выглядят линии на данный момент.

[ОБНОВЛЕНИЕ]

Согласно предоставленной OP информации, я предполагаю, что формат файлов журнала будет:

  • Каждая запись начинается с даты в формате "yyyy-mm-ddTHH:MM:SS.nanosec" и может применяться простая сортировка по словарю.
  • Каждая запись заканчивается на "\n\0", за исключением последней записи файла, которая заканчивается только на "\n".
  • Каждая запись может содержать символы новой строки в середине как часть записи для цели сгиба строки.

Тогда как насчет:

find . -name "*.log" -type f -exec cat "{}" \; -exec echo -ne "\0" \; | sort -z
  • echo -ne "\0" добавляет нулевой символ к последней записи файла. В противном случае запись будет объединена со следующей записью другого файла.
  • Опция -z для sort обрабатывает нулевой символ как разделитель записей.
  • Никакой другой опции для sort потребуется до сих пор.

Результат с опубликованным вводом OP:

2019-08-22T13:33:44.123456789 Hello
World
2019-08-22T13:33:44.123456789 Hello
World 2
2019-09-44T13:44:21.987654321 Simple line
2020-01-01T11:22:33.123456789 late
2020-01-01T11:22:33.123456789 late 2

Он по-прежнему сохраняет нулевой символ "\0" в конце каждой записи. Если вы хотите обрезать его, добавьте команду tr -d "\0" в конце конвейера как:

find . -name "*.log" -type f -exec cat "{}" \; -exec echo -ne "\0" \; | sort -z | tr -d "\0"

Надеюсь, это поможет.

...