Показать определенную строку

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
Sekta-N
Сообщения: 854
ОС: Зоопарк

Показать определенную строку

Сообщение Sekta-N »

Есть файл:

Код: Выделить всё

x32y45
 37
 x54y67
 37
 4543y6
 37
 54y665
 37
 64353
 37


Надо вытащить 4543y6. Но эта строчка мне не известна, зато я знаю что она находится перед 3-м значением 37. Предыдущая строка открывается через grep -B, а вот как заставить открыть именно 3-ю найденную строчку?
Нет тут подписи и не будет.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5448
ОС: Gentoo

Re: Показать определенную строку

Сообщение /dev/random »

Если это файл, а не поток, то тут удобнее всего будет воспользоваться ed.
Спасибо сказали:
smaharbA
Сообщения: 229
ОС: Windows Vista

Re: Показать определенную строку

Сообщение smaharbA »

Код: Выделить всё

grep -m3 -B1 37 l | grep -v 37 | tail -n 1


это ?
Я конечно далек от мысли...(с)
Спасибо сказали:
Аватара пользователя
Sekta-N
Сообщения: 854
ОС: Зоопарк

Re: Показать определенную строку

Сообщение Sekta-N »

Большое спасибо ;)
Нет тут подписи и не будет.
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Показать определенную строку

Сообщение SLEDopit »

Код: Выделить всё

cat document|sed -n '/37/{g;1!p;};h;' | sed -n 3p
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
Sekta-N
Сообщения: 854
ОС: Зоопарк

Re: Показать определенную строку

Сообщение Sekta-N »

Еще вопрос, как объяснить shell что $ это доллар?

Все разобрался \$ или '$'
Нет тут подписи и не будет.
Спасибо сказали:
smaharbA
Сообщения: 229
ОС: Windows Vista

Re: Показать определенную строку

Сообщение smaharbA »

Sekta-N писал(а):
17.02.2010 23:27
Еще вопрос, как объяснить shell что $ это доллар?


echo -e '$12\n1$2' | grep '^\$'

где то так вроде
Я конечно далек от мысли...(с)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Показать определенную строку

Сообщение drBatty »

Код: Выделить всё

#!/bin/sed -rnf

:begin
    N
    /\n37$/! D

    s///
    H

    x
    /\n.*\n.*\n/{
        s///p
        q
    }
    x

    n
    b begin
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Показать определенную строку

Сообщение drBatty »

SLEDopit писал(а):
17.02.2010 23:14
cat document|sed -n '/37/{g;1!p;};h;' | sed -n 3p

у мну наверное быстрее. ;)
но ваш скрипт тоже неплох.
только на ххх37ххх тоже сработает (
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Показать определенную строку

Сообщение SLEDopit »

drBatty писал(а):
17.02.2010 23:50
у мну наверное быстрее. ;)
угу, я что-то не придумал, как в одном седе все сделать.
drBatty писал(а):
17.02.2010 23:50
только на ххх37ххх тоже сработает (

Код: Выделить всё

cat document|sed -n '/^37$/{g;1!p;};h;' | sed -n 3p
пофиксил =)
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
Sekta-N
Сообщения: 854
ОС: Зоопарк

Re: Показать определенную строку

Сообщение Sekta-N »

Код: Выделить всё

cat document|sed -n '/^37$/{g;1!p;};h;' | sed -n 3p


Не работает

И еще вопрос

Как вывести все оставшиеся строки после 3-го числа 37? Количество строк неизвестно.

grep -A не катит, потому что захватывает все значения 37.

Пока мануал к sed почитаю ^_^
Нет тут подписи и не будет.
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Показать определенную строку

Сообщение SLEDopit »

Код: Выделить всё

 $ cat ll
x32y45
37
x54y67
37
4543y6
37
54y665
37
64353
37
 $ cat ll |sed -n '/^37$/{g;1!p;};h;' | sed -n 3p
4543y6
 $ cat ll |sed -n '/^37$/{g;1!p;};h;' | sed 1,2d;
4543y6
54y665
64353
ЧЯДНТ?
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
Sekta-N
Сообщения: 854
ОС: Зоопарк

Re: Показать определенную строку

Сообщение Sekta-N »

Ай, вы же наоборот отдельные 37 вытащили.

А у меня bgcolor=#fefffe> $37 </td>

Я сам виноват.
Нет тут подписи и не будет.
Спасибо сказали:
smaharbA
Сообщения: 229
ОС: Windows Vista

Re: Показать определенную строку

Сообщение smaharbA »

ууу, опять попытка распарсить хтмл, для этого есть дом
Я конечно далек от мысли...(с)
Спасибо сказали:
Аватара пользователя
Sekta-N
Сообщения: 854
ОС: Зоопарк

Re: Показать определенную строку

Сообщение Sekta-N »

Не попытка, а все нужное уже вытаскивается. У меня нет возможности запускать лишнее ПО на этих компьютерах. Вот не могу найти как оставшуюся часть кода вывести. Где-то находил статью на opennet по grep, tail и т.д. Теперь не могу.
Нет тут подписи и не будет.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Показать определенную строку

Сообщение drBatty »

Sekta-N писал(а):
18.02.2010 00:56
Как вывести все оставшиеся строки после 3-го числа 37? Количество строк неизвестно.

.*37.* тоже выводить? или не надо?
ps:

Код: Выделить всё

#!/bin/sed -rnf

:begin
    N
    /\n.*37.*$/! D

    s///
    H

    x
    /\n.*\n.*\n/{
        s///p
        q
    }
    x

    n
    b begin
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Показать определенную строку

Сообщение drBatty »

показывает все строки начиная с третьей, после которой стоит 37, при этом, вырезает строки, в которых есть 37.

Код: Выделить всё

#!/bin/sed -rnf

:begin
    N
    /\n.*37.*$/! D

    s///
    H

    x
    /\n.*\n.*\n/{
        s///p
        :print
            n
            /37/ ! p
            b print
    }
    x

    n
    b begin
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Показать определенную строку

Сообщение drBatty »

SLEDopit писал(а):
18.02.2010 00:12
угу, я что-то не придумал, как в одном седе все сделать.

у меня в одной sed, потому, что так проще vim'ом править - смотрите, как это вижу я: http://drbatty.ath.cx/docs/sed/tutor/examples/37.html
Всё дело в том, что на каждой строке нам приходится удалять пред-предыдущую. вы удаляете командой h, которая затирает строку в области удержания, а я удаляю командой D, которая удаляет первую строку в буфере. Проблема в том, что h именно копирует строку, а вот D просто полагает, что буфер начинается не с начала, а со второй строки (сдвигает указатель на буфер), именно из-за этой оптимизации пара N;D работает примерно в 3 раза быстрее.
(см. посл. пример из info sed)

smaharbA писал(а):
18.02.2010 07:04
ууу, опять попытка распарсить хтмл, для этого есть дом

ууу, мне надо обработать кучу текстов, и опять мне предлагают прикрутить к sed ещё какую-то хрень. Из-за того, что в тексте встретилось /<[^>]+>/...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Показать определенную строку

Сообщение SLEDopit »

drBatty
спасибо за разбор полетов.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
Sekta-N
Сообщения: 854
ОС: Зоопарк

Re: Показать определенную строку

Сообщение Sekta-N »

drBatty писал(а):
18.02.2010 09:23
показывает все строки начиная с третьей, после которой стоит 37, при этом, вырезает строки, в которых есть 37.

Код: Выделить всё

#!/bin/sed -rnf

 :begin
     N
     /\n.*37.*$/! D

     s///
     H

     x
     /\n.*\n.*\n/{
         s///p
         :print
             n
             /37/ ! p
             b print
     }
     x

     n
     b begin


Я так понял, что \n.*\n.*\n/ указывает как раз на 3-е значение 37. Только есть проблема, номер строки предварительно рассчитывается перед этим. Получится огромный костыль.
Нет тут подписи и не будет.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Показать определенную строку

Сообщение drBatty »

Sekta-N писал(а):
18.02.2010 11:54
Я так понял, что \n.*\n.*\n/ указывает как раз на 3-е значение 37

нет
в области удержания лежит

Код: Выделить всё

пустая строка \n
первая строка после которой 37 \n
вторая строка после которой 37 \n
третья строка после которой 37

вот как накопится 1 пустая строка и ещё 2 каких-нибудь (3 штуки \n), так значится мы и нашли третью, после которой 37.

Сами строки с 37 никогда не сохраняются. (я сначала подумал, что нужно ТОЧНО /^37$/, а зачем хранить 37? потом впишем если что, но вы сказали что там НЕ ТОЛЬКО 37, вот так и получилось...)


Sekta-N писал(а):
18.02.2010 11:54
Только есть проблема, номер строки предварительно рассчитывается перед этим. Получится огромный костыль.

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

Напишите сами, в конце концов, язык sed очень простой, даже в чём-то примитивный :)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
smaharbA
Сообщения: 229
ОС: Windows Vista

Re: Показать определенную строку

Сообщение smaharbA »

drBatty писал(а):
18.02.2010 09:47
ууу, мне надо обработать кучу текстов, и опять мне предлагают прикрутить к sed ещё какую-то хрень. Из-за того, что в тексте встретилось /<[^>]+>/...



ну да, ну да... и все файлы будут разбиты по строкам ?
Я конечно далек от мысли...(с)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Показать определенную строку

Сообщение drBatty »

smaharbA писал(а):
18.02.2010 17:20
ну да, ну да... и все файлы будут разбиты по строкам ?

? вы про что?
как (не)захочу так и будут (не)разбиты.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: