Author Topic: bash, вывести все строки после первого вхождения искомой  (Read 10792 times)

0 Members and 1 Guest are viewing this topic.

Offline Xray_Linux_Root

  • Sr. Member
  • ****
  • Posts: 296
  • Karma: +2/-0
Доброго времени суток!
Снова в поисках... Есть вот такой код:
Code: [Select]
grep -A 999999999 "$LAST_LINE" filein.txt | grep -v "$LAST_LINE" >> fileout.txtГде LAST_LINE = любому уникальному набору символов (т.е. встретиться в файле может максимум только один раз).
Здесь выбираются все строки файла filein.txt после строки LAST_LINE исключая саму строку, и выводятся в файл fileout.txt
Это работает, но как-то это не красиво выглядит.

Каким иным способом, в bash, можно решить данную задачу?

Чего-то ничего в голову не приходит.  
Mandrake, ASPLinux, Slackware, RedHat, Fedora, Debian
Зачем M$ Exchange? Есть eGroupware!
-j MASQUERADE + друзья в других сетях помогут построить мир независимо от желания вашего провайдера ;)

Offline never hood

  • Hero Member
  • *****
  • Posts: 845
  • Karma: +16/-10
  • www.4job.co
    • Работа, которую ты искал
ну, например, такую колбасу попробуй (имхо, не намного лучше):
Code: [Select]
awk -v line1="$1" '
BEGIN{ out = 0 }
{
    if (out) print $0
    else if ($0 == line1) out = 1
}'
если это содержимое скрипта, скажем, lastlines, то вызываем его
Code: [Select]
$ cat filein.txt | ./lastlines "строка, после которой выводим все" > fileout.txt(или ">>", если дополняем)

можно и шеллом (те же пасхальные, но с другим орнаментом) ограничиться, тогда что-то вроде:
Code: [Select]
#!/bin/bash

out=0
while read LINE; do
    if [ $out -gt 0 ]; then echo $LINE
    else
        [[ $LINE = "$1" ]] && out=1
    fi
done
вызываем аналогично

Offline stager

  • Jr. Member
  • **
  • Posts: 78
  • Karma: +1/-0
    • http://time.tsk.ru
Code: [Select]
sed ": l1 /$LAST_LINE/T l2; d; b l1;  : l2 n; b l2" filein.txt |sed 1d
Segmentation fault. Core dumped. Kernel panic. System halted. Power down. Аминь.

Offline nuclight

  • Full Member
  • ***
  • Posts: 207
  • Karma: +1/-2
    • http://antigreen.org
Quote from: Xray_Linux_Root
Доброго времени суток!
Снова в поисках... Есть вот такой код:
Code: [Select]
grep -A 999999999 "$LAST_LINE" filein.txt | grep -v "$LAST_LINE" >> fileout.txtГде LAST_LINE = любому уникальному набору символов (т.е. встретиться в файле может максимум только один раз).
Здесь выбираются все строки файла filein.txt после строки LAST_LINE исключая саму строку, и выводятся в файл fileout.txt
Это работает, но как-то это не красиво выглядит.

Каким иным способом, в bash, можно решить данную задачу?

Чего-то ничего в голову не приходит.  :blink:

Можно воспользоваться split с ключом -p или csplit (но там другие имена файлов, хотя при дублирующзихся строках это удобнее).

Можно так:
Code: [Select]
cat filein.txt | sed -n "/$LAST_LINE/,// p"
Можно переписать вышеприведенное на awk в более простом виде (двухстрочная командная строка без файлов скриптов), чем был в предыдущем посте:
Code: [Select]
cat filein.txt | awk "/$LAST_LINE/ {ou=1}
{if (out) print}"
WBR, Nuclear Lightning
[FreeBSD][Давить зелёных]

Offline never hood

  • Hero Member
  • *****
  • Posts: 845
  • Karma: +16/-10
  • www.4job.co
    • Работа, которую ты искал
все здорово, но строку не нужно было включать, что создает определенные хлопоты...
тогда вот такой вариант:
Code: [Select]
cat filein.txt | sed -n "/$LAST_LINE/,// p" | tail -n +2
PS. Позволю себе заметить, что к bash'у имеет отношение только один пример из озвученных, все остальное прекрасно будет работать в любом шелле.

Offline nuclight

  • Full Member
  • ***
  • Posts: 207
  • Karma: +1/-2
    • http://antigreen.org
Quote from: never hood
все здорово, но строку не нужно было включать, что создает определенные хлопоты...
тогда вот такой вариант:
Code: [Select]
cat filein.txt | sed -n "/$LAST_LINE/,// p" | tail -n +2
PS. Позволю себе заметить, что к bash'у имеет отношение только один пример из озвученных, все остальное прекрасно будет работать в любом шелле.

И даже этот пример в 5 секунд переписывается так, чтоб работать в любом шелле семейства sh.
WBR, Nuclear Lightning
[FreeBSD][Давить зелёных]

Offline Xray_Linux_Root

  • Sr. Member
  • ****
  • Posts: 296
  • Karma: +2/-0
Мужики! Всем спасибо выручили!
Mandrake, ASPLinux, Slackware, RedHat, Fedora, Debian
Зачем M$ Exchange? Есть eGroupware!
-j MASQUERADE + друзья в других сетях помогут построить мир независимо от желания вашего провайдера ;)

Offline Victor Snezhko

  • Jr. Member
  • **
  • Posts: 72
  • Karma: +0/-0
Немного неспортивно, но мне больше всего нравится грепом:
grep -A 999999999 substr file