grep первые n и последние n символов из строки в файле

top -p `pgrep -d "," java`

Объяснение:

  1. top -p pid1, pid2 : показать информацию о нескольких процессах, pid должен быть разделен ,
  2. pgrep -d "," java : вывести идентификаторы всех программ на Java, по умолчанию эти идентификаторы разделяются новой строкой. используйте -d "," , чтобы разделить его на , , как того требует верх.

Если вы видите ошибку типа top: -p аргумент отсутствует , это означает, что Java-программа не запущена, т.е. pgrep не выводит данные.

6
25.03.2017, 01:30
7 ответов

вы можете сделать что-то вроде этого

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

Вы можете использовать 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
11
27.01.2020, 20:20
perl -F '' -lane 'print @F[0..15, -5..-1]' yourfile

Explanation

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

-l => ORS=\n

-a => @F массив содержит поля, например, $F[15] => содержит 16-й символ

-n => не печатать, если не попросить

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

2
27.01.2020, 20:20

Вы можете использовать sed:

sed -r "s/^(.{15} ?).*(.{5})$/\1\2/" logfile

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

6
27.01.2020, 20:20

В 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]$ 
4
27.01.2020, 20:20

вы можете сделать что-то вроде этого

cut -c1-15 logfile > file;

cut -c44- logfile > file1;

paste file file1 > logfilenew;

rm file file1;

cat logfilenew

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

3
27.01.2020, 20:20

Как об этом:

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.

3
27.01.2020, 20:20

Теги

Похожие вопросы