Вопрос или проблема
У меня есть файл журнала, который выглядит следующим образом:
Mar 23 08:20:23 New file got created in sec: 235
Mar 23 08:21:45 New file got created in sec: 127
Mar 23 08:22:34 New file got created in sec: 875
Mar 23 08:25:46 New file got created in sec: 322
Mar 23 08:26:12 New file got created in sec: 639
Мне нужно, чтобы вывод выглядел так:
Mar 23 08:20:23 : 235
Mar 23 08:21:45 : 127
Mar 23 08:22:34 : 875
Mar 23 08:25:46 : 322
Mar 23 08:26:12 : 639
То, что я могу сделать, это просто отфильтровать либо первую, либо последнюю часть строки. Я не могу объединить их вместе. Как я могу получить желаемый вывод из моего ввода?
Вы можете использовать cut следующим образом:
Команда:
cut --complement -c17-43 file1.txt
Вывод:
Mar 23 08:20:23 : 235
Mar 23 08:21:45 : 127
Mar 23 08:22:34 : 875
Mar 23 08:25:46 : 322
Mar 23 08:26:12 : 639
Вы можете сделать что-то подобное
awk '{print $1,$2,$3,":",$NF}' logfile
Вы можете использовать sed
:
sed -r "s/^(.{15} ?).*(.{5})$/\1\2/" logfile
По предложениям, я сделал так, чтобы первый шаблон учитывал однозначные дни, которые могут не иметь нуля впереди, и использовал .*
для среднего шаблона, чтобы быть более гибким.
В awk это выглядит примерно так. Очень просто.
[zee@dev-instance temp]$ cat file1.txt
Mar 23 08:20:23 New file got created in sec: 235
Mar 23 08:21:45 New file got created in sec: 127
Mar 23 08:22:34 New file got created in sec: 875
Mar 23 08:25:46 New file got created in sec: 322
Mar 23 08:26:12 New file got created in sec: 639
[zee@dev-instance temp]$ awk -F" " '{ print $1" "$2" "$3" : "$10 }'<file1.txt
Mar 23 08:20:23 : 235
Mar 23 08:21:45 : 127
Mar 23 08:22:34 : 875
Mar 23 08:25:46 : 322
Mar 23 08:26:12 : 639
[zee@dev-instance temp]$
Как насчет этого:
sed -e 's/^\(.\{4\}\).*\(.\{4\}\)$/\1 \2/'
(Вы можете разобраться с перенаправлением ввода/вывода или указать имя файла и т.д. Смотрите sed(1) для получения дополнительной информации о вызовах.)
Здесь я выбрал количество символов равным 4, но вы можете подставить любое другое число. Обратите внимание, что первое и последнее количество символов могут быть даже разными:
sed -e 's/^\(.\{5\}\).*\(.\{2\}\)$/\1 \2/'
Это вернет первые 5 символов и последние 2 символа каждой строки. Я оставлю это вам, чтобы разобраться, как параметризовать это дальше.
Также обратите внимание, что я выбрал sed(1), а не grep(1) (или один из его вариантов). Я знаю, что это может быть не совсем то, что вы хотите, поскольку вы просили регулярное выражение grep, а не регулярное выражение sed.
Вы можете сделать что-то подобное
cut -c1-15 logfile > file;
cut -c44- logfile > file1;
paste file file1 > logfilenew;
rm file file1;
cat logfilenew
Вывод будет храниться в logfilenew.
perl -F '' -lane 'print @F[0..15, -5..-1]' yourfile
Пояснение
-F ''
=> разбивает строку на отдельные символы, другими словами, все поля имеют толщину 1 символ.
-l
=> ORS=\n
-a
=> @F массив хранит поля, например, $F[15] => хранит 16-й символ
-n
=> не печатать, если не запрашивается специально
@F[0..15, -5..-1]
=> это срез массива @F
с первыми 16 символами и последними 5 символами, нечто вроде cut
Я использовал awk следующим образом:
> cat file.txt
Mar 23 08:20:23 New file got created in sec: 235
Mar 23 08:21:45 New file got created in sec: 127
Mar 23 08:22:34 New file got created in sec: 875
Mar 23 08:25:46 New file got created in sec: 322
Mar 23 08:26:12 New file got created in sec: 639
> cat file.txt | awk '{ print substr($0, 0, 15), substr($0, length($0)-4, 5) }'
Mar 23 08:20:23 : 235
Mar 23 08:21:45 : 127
Mar 23 08:22:34 : 875
Mar 23 08:25:46 : 322
Mar 23 08:26:12 : 639
Ответ или решение
Как извлекать первые n и последние n символов строки из файла с помощью командной строки
Работа с логами и текстовыми файлами является важной частью работы ИТ-специалистов. Задача, с которой вы столкнулись, заключается в извлечении первых и последних символов каждой строки в файле. В данном случае мы разберем методы, которые помогут вам достичь нужного вам формата вывода.
Пример содержимого файла
Ваш лог-файл выглядит следующим образом:
Mar 23 08:20:23 New file got created in sec: 235
Mar 23 08:21:45 New file got created in sec: 127
Mar 23 08:22:34 New file got created in sec: 875
Mar 23 08:25:46 New file got created in sec: 322
Mar 23 08:26:12 New file got created in sec: 639
Вы хотите преобразовать его в следующий формат:
Mar 23 08:20:23 : 235
Mar 23 08:21:45 : 127
Mar 23 08:22:34 : 875
Mar 23 08:25:46 : 322
Mar 23 08:26:12 : 639
Использование awk
awk
является мощным инструментом для обработки текстовых файлов. Чтобы извлечь нужные фрагменты строк, вы можете использовать следующую команду:
awk '{ print $1" "$2" "$3" : "$10 }' yourfile.txt
$1
,$2
и$3
представляют собой первый, второй и третий элементы строки (данные даты и времени).:
– это символ, который вы хотите вставить между первой и последней частью.$10
– это десятый элемент, который содержит нужное число.
Использование sed
sed
также может быть полезен для выполнения этой задачи. Следующая команда удалит всё, кроме первых 15 символов и последних 5 символов строки:
sed -r 's/^(.{15}).*(.{5})$/\1 \2/' yourfile.txt
^(.{15})
– захватывает первые 15 символов..*
– игнорирует все символы между ними.(.{5})$
– захватывает последние 5 символов.
Использование cut и paste
Если вы предпочитаете комбинацию инструментов, cut
и paste
также могут быть использованы в паре. Используйте их следующим образом:
cut -c1-15 yourfile.txt > start.txt
cut -c44- yourfile.txt > end.txt
paste start.txt end.txt > output.txt
Этот подход создает временные файлы для первой и последней части بيانات, а затем объединяет их в итоговый файл.
Использование Perl
Если вам удобнее использовать Perl, вот команда для достижения того же результата:
perl -F '' -lane 'print @F[0..15, -5..-1]' yourfile.txt
-F ''
разбивает строку на отдельные символы.-l
настроит вывод в формате строки.-a
позволяет использовать массив для хранения символов, что дает вам гибкость в доступе к нужным символам.
Заключение
Вышеописанные методы предлагают несколько подходов к извлечению первых и последних символов строк в файлах. В зависимости от вашей конкретной ситуации и предпочтений, вы можете выбрать наиболее удобный вариант. Будь то awk
, sed
, комбинация cut
и paste
или Perl, у вас есть все инструменты, чтобы эффективно обрабатывать текстовые файлы и лог-файлы. Используйте эти революционные методы для улучшения ваших рабочих процессов в области ИТ.