как найти строку из строки в bash? - PullRequest
0 голосов
/ 29 мая 2018

У меня есть строка, как показано ниже,

May 29 01:30:15 apps1 docker/[a:vjwdrze2e3qxrf5eck4s3yv:a][u:jack:u][5425]: 05:30:15.693 INFO  [mockAppThread:21] app.js - API Mock App Server started successfully on 0.0.0.0 with port 7001.

В качестве вывода я хочу только метку времени и сообщение об ошибке.

May 29 01:30:15 API Mock App Server started successfully on 0.0.0.0 with port 7001.

Я могу получить метку времени командой awk, как показано ниже.

awk '{print $1,$2,$3}'

Я могу получить сообщение, как показано ниже:

cut -d "-" -f2

Как я могу получить оба в одной команде?Есть ли какой-нибудь упрощенный способ его получить?

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

Вы также можете использовать perl или sed для управления вашим файлом:

perl -pe 's/(?<=.{16}).*(?=-)//g' file

ВХОД:

$ cat file 
May 28 04:28:15 apps1 docker/[a:vjwdrze2e3qxrf5eck4s3yv:a][u:jack:u][5425]: 05:30:15.693 INFO  [mockAppThread:21] app.js - TEST MESSAGE 3 
May 29 01:30:15 apps1 docker/[a:vjwdrze2e3qxrf5eck4s3yv:a][u:jack:u][5425]: 05:30:15.693 INFO  [mockAppThread:21] app.js - API Mock App Server started successfully on 0.1.0.0 with port 7001.
May 30 11:30:15 apps1 docker/[a:vjwdrze2e3qxrf5eck4s3yv:a][u:jack:u][5425]: 05:30:15.693 INFO  [mockAppThread:21] app.js - TEST MESSAGE 2 

OUPUT:

$ perl -pe 's/(?<=.{16}).*(?=-)//g' file                                                                                                                                                                                                                        
May 28 04:28:15 - TEST MESSAGE 3 
May 29 01:30:15 - API Mock App Server started successfully on 0.1.0.0 with port 7001.
May 30 11:30:15 - TEST MESSAGE 2 

Пояснения:

Эта команда perl удалит строку, начинающуюся с 17-й позиции, до достижения -.

0 голосов
/ 29 мая 2018

Зависит от повторяющейся структуры (ключевое слово).Сед раствор

sed 's/\(:[0-9]\{2\}\).*\(- API\)/\1 \2/' YourFile
0 голосов
/ 29 мая 2018

После awk может помочь вам здесь.

awk '{sub(/ apps1.*app\.js/,"")} 1'  Input_file

Решение 2-е:

awk -F" app.js - " '{sub(/ apps1.*/,"",$1);print $1,$2}'   Input_file

Решение третье: В соответствии с предложением Субеха в комментариях добавлено еще 1 решение.

awk -F'apps1|app.js -' '{ print $1 $3 }' Input_file
...