Задать вопрос
@Valeriu147

Как сделать выборку, со строгим GREP по нескольким линиям?

Добрый день. Стала такая интересная задача, мне нужно, сделать grep по трем фразам, но не просто grep и что бы он искал по всему документу, эти три слова, а что бы он выводил их один за другим. Покажу на примере.
У меня есть такой файл:

1 London Paris |I am the Rock|
2 Moscow Kyiv |I am the Cena|
3 Kharkiv Dnepr |I am the CM Punk|
4 Ottava Amsterdam |I am the Rock|
5 Oslo New-Yourk |I am the Rock|
6 Lviv Varshava |I am the Cena|
7 Berlin Rome |I am the CM Punk|
8 Moscow Oslo |I am the Cena|
9 Kharkiv Kyiv |I am the Brock Lesnar|


Собственно, я должен вывести, один за одним линии содержащие, "I am the Rock" "I am the Cena" "I am the CM Punk". Строго в этой последовальности, одна линия за одной, которые содержат только эти фразы, должно получиться, такое:

1 London Paris |I am the Rock|
2 Moscow Kyiv |I am the Cena|
3 Kharkiv Dnepr |I am the CM Punk|
5 Oslo New-Yourk |I am the Rock|
6 Lviv Varshava |I am the Cena|
7 Berlin Rome |I am the CM Punk|


Вроде, все просто, пробую эту команду:

grep "I am the Rock\|I am the Cena\|I am the CM Punk" textfile


На выходе я получаю:

1 London Paris |I am the Rock|
2 Moscow Kyiv |I am the Cena|
3 Kharkiv Dnepr |I am the CM Punk|
4 Ottava Amsterdam |I am the Rock|
5 Oslo New-Yourk |I am the Rock|
6 Lviv Varshava |I am the Cena|
7 Berlin Rome |I am the CM Punk|
8 Moscow Oslo |I am the Cena|


Как видите, у меня есть повторяющиеся значения с индексом 4 и 8

4 Ottava Amsterdam |I am the Rock|

8 Moscow Oslo |I am the Cena|


Не могу понять, пробовал подобным образом и sed, awk, egrep. Но что-то не выходит, в чем я мог допустить ошибку ? Натолкните на мысль пожалуйста.
  • Вопрос задан
  • 570 просмотров
Подписаться 1 Оценить 1 комментарий
Решения вопроса 1
@abcd0x00
Здесь делал то же самое
Как правильно написать скрипт на Bash?

text="\
1 London Paris |I am the Rock|
2 Moscow Kyiv |I am the Cena|
3 Kharkiv Dnepr |I am the CM Punk|
4 Ottava Amsterdam |I am the Rock|
5 Oslo New-Yourk |I am the Rock|
6 Lviv Varshava |I am the Cena|
7 Berlin Rome |I am the CM Punk|
8 Moscow Oslo |I am the Cena|
9 Kharkiv Kyiv |I am the Brock Lesnar|
"


fsm()
{
    awk '{
        switch (state) {
        case 0:
            if (/Rock/) {
                out = $0
                state = 1
            }
            break
        case 1:
            if (/Rock/) {
                out = $0;
            } else if (/Cena/) {
                out = out"\n"$0
                state = 2
            } else {
                out = ""
                state = 0
            }
            break
        case 2:
            if (/Punk/) {
                out = out"\n"$0
                print out
                out = ""
                state = 0
            } else {
                out = ""
                state = 0
            }
            break
        }
    }'
}

echo "$text" | fsm


Вывод
[guest@localhost tmp]$ echo "$text" | fsm
1 London Paris |I am the Rock|
2 Moscow Kyiv |I am the Cena|
3 Kharkiv Dnepr |I am the CM Punk|
5 Oslo New-Yourk |I am the Rock|
6 Lviv Varshava |I am the Cena|
7 Berlin Rome |I am the CM Punk|
[guest@localhost tmp]$
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Оно ?
https://habrahabr.ru/sandbox/102954/
grep - умеет работать только со строкой! не ждите от него работы с массивами данных
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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