Tomsk Sysadmins Forum

Unix => Программирование => Topic started by: Xray_Linux_Root on February 07, 2008, 16:57:02

Title: bash, вывести все строки после первого вхождения искомой
Post by: Xray_Linux_Root on February 07, 2008, 16:57:02
Доброго времени суток!
Снова в поисках... Есть вот такой код:
Code: [Select]
grep -A 999999999 "$LAST_LINE" filein.txt | grep -v "$LAST_LINE" >> fileout.txtГде LAST_LINE = любому уникальному набору символов (т.е. встретиться в файле может максимум только один раз).
Здесь выбираются все строки файла filein.txt после строки LAST_LINE исключая саму строку, и выводятся в файл fileout.txt
Это работает, но как-то это не красиво выглядит.

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

Чего-то ничего в голову не приходит.  
Title: bash, вывести все строки после первого вхождения искомой
Post by: never hood on February 07, 2008, 21:01:50
ну, например, такую колбасу попробуй (имхо, не намного лучше):
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
вызываем аналогично
Title: bash, вывести все строки после первого вхождения искомой
Post by: stager on February 08, 2008, 14:00:48
Code: [Select]
sed ": l1 /$LAST_LINE/T l2; d; b l1;  : l2 n; b l2" filein.txt |sed 1d
Title: bash, вывести все строки после первого вхождения искомой
Post by: nuclight on February 08, 2008, 14:16:10
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}"
Title: bash, вывести все строки после первого вхождения искомой
Post by: never hood on February 08, 2008, 14:54:23
все здорово, но строку не нужно было включать, что создает определенные хлопоты...
тогда вот такой вариант:
Code: [Select]
cat filein.txt | sed -n "/$LAST_LINE/,// p" | tail -n +2
PS. Позволю себе заметить, что к bash'у имеет отношение только один пример из озвученных, все остальное прекрасно будет работать в любом шелле.
Title: bash, вывести все строки после первого вхождения искомой
Post by: nuclight on February 11, 2008, 11:08:18
Quote from: never hood
все здорово, но строку не нужно было включать, что создает определенные хлопоты...
тогда вот такой вариант:
Code: [Select]
cat filein.txt | sed -n "/$LAST_LINE/,// p" | tail -n +2
PS. Позволю себе заметить, что к bash'у имеет отношение только один пример из озвученных, все остальное прекрасно будет работать в любом шелле.

И даже этот пример в 5 секунд переписывается так, чтоб работать в любом шелле семейства sh.
Title: bash, вывести все строки после первого вхождения искомой
Post by: Xray_Linux_Root on February 11, 2008, 15:24:19
Мужики! Всем спасибо выручили!
Title: bash, вывести все строки после первого вхождения искомой
Post by: Victor Snezhko on February 14, 2008, 00:10:01
Немного неспортивно, но мне больше всего нравится грепом:
grep -A 999999999 substr file