Tomsk Sysadmins Forum
Unix => Программирование => Topic started by: Xray_Linux_Root on February 07, 2008, 16:57:02
-
Доброго времени суток!
Снова в поисках... Есть вот такой код:
grep -A 999999999 "$LAST_LINE" filein.txt | grep -v "$LAST_LINE" >> fileout.txt
Где LAST_LINE = любому уникальному набору символов (т.е. встретиться в файле может максимум только один раз).
Здесь выбираются все строки файла filein.txt после строки LAST_LINE исключая саму строку, и выводятся в файл fileout.txt
Это работает, но как-то это не красиво выглядит.
Каким иным способом, в bash, можно решить данную задачу?
Чего-то ничего в голову не приходит.
-
ну, например, такую колбасу попробуй (имхо, не намного лучше):
awk -v line1="$1" '
BEGIN{ out = 0 }
{
if (out) print $0
else if ($0 == line1) out = 1
}'
если это содержимое скрипта, скажем, lastlines, то вызываем его
$ cat filein.txt | ./lastlines "строка, после которой выводим все" > fileout.txt
(или ">>", если дополняем)
можно и шеллом (те же пасхальные, но с другим орнаментом) ограничиться, тогда что-то вроде:
#!/bin/bash
out=0
while read LINE; do
if [ $out -gt 0 ]; then echo $LINE
else
[[ $LINE = "$1" ]] && out=1
fi
done
вызываем аналогично
-
sed ": l1 /$LAST_LINE/T l2; d; b l1; : l2 n; b l2" filein.txt |sed 1d
-
Доброго времени суток!
Снова в поисках... Есть вот такой код:
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 (но там другие имена файлов, хотя при дублирующзихся строках это удобнее).
Можно так:
cat filein.txt | sed -n "/$LAST_LINE/,// p"
Можно переписать вышеприведенное на awk в более простом виде (двухстрочная командная строка без файлов скриптов), чем был в предыдущем посте:
cat filein.txt | awk "/$LAST_LINE/ {ou=1}
{if (out) print}"
-
все здорово, но строку не нужно было включать, что создает определенные хлопоты...
тогда вот такой вариант:
cat filein.txt | sed -n "/$LAST_LINE/,// p" | tail -n +2
PS. Позволю себе заметить, что к bash'у имеет отношение только один пример из озвученных, все остальное прекрасно будет работать в любом шелле.
-
все здорово, но строку не нужно было включать, что создает определенные хлопоты...
тогда вот такой вариант:
cat filein.txt | sed -n "/$LAST_LINE/,// p" | tail -n +2
PS. Позволю себе заметить, что к bash'у имеет отношение только один пример из озвученных, все остальное прекрасно будет работать в любом шелле.
И даже этот пример в 5 секунд переписывается так, чтоб работать в любом шелле семейства sh.
-
Мужики! Всем спасибо выручили!
-
Немного неспортивно, но мне больше всего нравится грепом:
grep -A 999999999 substr file