grep first 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 

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

вы можете сделать что-то подобное

 awk '{print $1,$2,$3,":",$NF}' logfile 

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

Вы можете использовать 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 

Вы можете использовать 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.

 perl -F '' -lane 'print @F[0..15, -5..-1]' yourfile 

объяснение

-F '' => разделите строку на отдельные символы, IOW, все поля имеют толщину 1 балл.

-l => ORS=\n

-a => @F array holds the fields, eg, $F[15] => holds the 16-th character

-n => don't print unless specifically asked to

@F[0..15, -5..-1] => – это срез массива @F с первыми 16 символами, а последние 5 символов – что-то вдоль линий cut

вы можете сделать что-то подобное

cut -c1-15 logfile > file;

cut -c44- logfile > file1;

paste file file1 > logfilenew;

rm file file1;

cat logfilenew

вывод будет сохранен в logfilenew.