вывести первые 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

То, что я могу сделать, это просто отфильтровать либо первую, либо последнюю часть строки. Я не могу объединить их вместе. Как я могу получить желаемый вывод из моего ввода?

Вы можете использовать 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, у вас есть все инструменты, чтобы эффективно обрабатывать текстовые файлы и лог-файлы. Используйте эти революционные методы для улучшения ваших рабочих процессов в области ИТ.

Оцените материал
Добавить комментарий

Капча загружается...