IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Пингвинятник (ОС *NIX) (http://www.imho.ws/forumdisplay.php?f=76)
-   -   cut, sed, awk and Co - Вопросы по парзингу (http://www.imho.ws/showthread.php?t=105114)

shuron 20.06.2006 22:48

cut, sed, awk and Co - Вопросы по парзингу
 
Не могу понять как мне из строчки соcтояшей скорее из одного слова прочитать превый символ?

Я так понял что с sed можно.. но чтото мои попытки не срабатывают :(

P.S. Частенько нужны всякие такие вещи поэтому я топик так назвал сразу.

imhoman101 21.06.2006 00:36

Дарагой, зачэм sed, зачэм awk :-) Имхо в данном случае можно и без них обойтись средствами bash.

#!/bin/bash
echo ${1:0:1}

$1 - это входной параметр который ты bash-скрипту подаешь когда вызываешь его из командной строки, это может быть слово, число итд
${1:0:1} - означает что в массиве $1 нас интересуют элементы с 0 по 1, то есть самый первый элемент(символ) массива.

rontommy 21.06.2006 00:37

cut -c1-1

shuron 21.06.2006 12:19

Спасибо обоим! :yees:

Цитата:

Сообщение от imhoman101
#!/bin/bash
echo ${1:0:1}

Про такие дела я и не знал.. надо почитать про масивы в bash

shuron 21.06.2006 14:16

a kak mne srawnit tper eto perwij simvol s 4emni bud
first = `echo $1 | cut -c1`
if [ "$first" -ne "\/" ]


ne rabotaet tam integer oschidaetsa.. a kak char ili string srawniwaetsa?

noname 21.06.2006 15:05

http://www.tldp.org/LDP/abs/html/
http://gazette.linux.ru.net/rus/arti...abs-guide.html

shuron 21.06.2006 15:35

iswinjaus, wse prawilno ja neprawoilno tam posmotrel..
stringi podrugomu srawniwajutsa..
teper wse paschet
thx

shuron 22.06.2006 15:50

Уважаемые знатоки продулжу..
например лежи у меня скрипт в /root/lala/lala.sh

в PATH его нет, вызывать его надо из различных текущих каталогов указанием абсолутног пути.

Но скрипт это в свою очередь вызывет другой подскрипт кторый всегда лежит в том же каталоге что и lala.sh

Так вот Как в скрипте lala.sh сделать правильный иклуд другово скрипата?
Условие абсолютный путь прописаь нельзя..

Пояняю в lala.sh есть инклуд типа.
includefile=file.inc
. $includefile


Данный вариант работает только при вызове из ттгоже каталока где лежат скрипты..
Как генерализировать да попрощё?

xoy 22.06.2006 16:26

а как на счет смены текущего каталога в окружении первого скрипта?
чем не устраивает?

rontommy 22.06.2006 17:49

Цитата:

shuron:
Так вот Как в скрипте lala.sh сделать правильный иклуд другово скрипата?
Условие абсолютный путь прописаь нельзя..

Пояняю в lala.sh есть инклуд типа.
includefile=file.inc
. $includefile
script_dir_name="`dirname $0`"
Ну а далее остается добавить имя инклуда.

shuron 22.06.2006 19:33

Цитата:

Сообщение от xoy
а как на счет смены текущего каталога в окружении первого скрипта?
чем не устраивает?

dlaj etogo nado kakto usnat kuda menajt...

Цитата:

Сообщение от rontommy
script_dir_name="`dirname $0`"
Ну а далее остается добавить имя инклуда.

wot teper wischu kuda..
to 4to nuschno! ne snal 4to est takaja komanda.
thx!

shuron 28.06.2006 16:02

А вот теперь такая задачка..
надо
1. из лог файла прочитать скажем 50 последних строк.
2. анализировать построчно. в анализе выявить строчеку короая например содержит выражение в переменной $expression1.
3. было бы круто еще и заданую часть выявленной в пункте 2 строчки получить но я думаю я это с awk смогу..
так что пункты 1 и 2 пока важнее

зарание спасибо!

xoy 28.06.2006 16:18

для первых двух пунктов, я обычно делаю так:

tail logfile |grep $expression1

Drakosha 28.06.2006 17:03

ага, только добавь -n в tail

tail -n 50

:)

shuron 28.06.2006 18:54

Блин точно! всет ак просто.. я всё еще не привыкну к Pipe.
thx

shuron 01.07.2006 21:22

А теперь такая задача ест..

Код:

for file in `find $1 -cmin -$2`
do

    if [ -f $file ]
    then
        echo "$file"
    else
        echo "DIR: $file";
    fi
done

пре условии что $1 это существующий путь а $2 это время в мнутах это цикл пробегает и выдет на экран все файлы у которых максиму это вреямя назад менялся статус.

Находятся также каталоги и они выдаются с пометкой "DIR:"

Однако это код имеет баг!
Если изменены файла в которых есть пробел (а может и дургие разделители не пробовал) то цикл начинает выдвать чушь.
типа если есть фал
/home/user/li4nij fail log
тидопустим только он был изменён то для цикла будет 3 токена.
хотя по смыслу должен быть один..

Как сделать так чтобы на спотыкаться на этом?

Drakosha 02.07.2006 01:35

Интересный вопрос :)
решение взял из http://www.tldp.org/LDP/abs/html/loops1.html

Код:

/tmp/orm>ls -l
total 0
-rw-r--r-- 1 xxx users 0 2006-07-01 23:55 1
-rw-r--r-- 1 xxx users 0 2006-07-01 23:55 2
-rw-r--r-- 1 xxx users 0 2006-07-01 23:55 3 4
GOOD:
/tmp/orm>for f in "$( find .)"; do echo "$f"; done
.
./1
./2
./3 4
BAD:
/tmp/orm>for f in `find .`; do echo $f; done
.
./1
./2
./3
4


shuron 02.07.2006 13:14

Круто спасибо!
:yees: :yees: :claps:
Но вот только теперь тэст в теле цыкла
Код:

    if [ -f $file ]
    then
        echo "$file"
    else
        echo "DIR: $file";
    fi

как-то не срабатывает..
В первый файл он опредиляет как "DIR:"
А все остальные без "DIR." Хотя find выдает и каталоги :(
что-то не пойму почему так происходит. Цыкл вроде нормально выглядит. Если к стати вставить -d вместо -f то вывод не меняется вообще :(
Не пойму где ошибка.??? :( :молись:

Drakosha 02.07.2006 18:45

google рулит...

Код:

find . | while read f
do
    if [ -f "$f" ]
    then
        echo "FILE $f"
    else       
        echo "DIR: $f"
    fi
done

bash-3.00$ ls -l
total 36
drwxr-xr-x 2 4096 Jul 2 16:53 d1
drwxr-xr-x 2 4096 Jul 2 16:53 d 1
-rw-r--r-- 1 0 Jul 2 16:52 f1
-rw-r--r-- 1 0 Jul 2 16:52 f2
-rw-r--r-- 1 0 Jul 2 16:53 f 3
-rw-r--r-- 1 48 Jul 2 17:06 test.sh

shuron 02.07.2006 20:14

da dejstwitelno eto rabotaet! google rulit.. tolko daschene snal 4to iskat.. :( i schas ne sowsem jasno po4emu tot warinat ne rabotal.. nu pofig, glawnoe 4to rabotaet etot.! :beer: :beer:

А у меня тут уже новая проблема! :eek: :idontnow:
В вышеуказанной задаче мне нужен второй правметр для find
Это величниа в минутах.
Она еевляется разницей текушего времени и времени последнего изменения указаного каталога!
И всё должно быть в минутах!
тоесть:
Код:

time (in min) = toMinutes( getCurrentTime() - modTimeOf(somedir))
Надеюсь понятно чтоимеется в виду

Ну дату кактлога я могу прочитать например так:
ls -l --time=ctime somedir | awk '{print $6}'

и время аналогично. но формат конечно не тот. приходится умножать и считать. и также с текущим времем..
и всё для того чтобы отнять их дург от друга и получить минуты..

Конечная цель цикла же проити по файлам одного каталога и посмотреть если в бэкап-каталоге файлы бывшие измененённые с момента создания предыидущего снапшота (другой каталог) и удалить их в бэкупкаталоге.

короче всё уже есть фот только с минутами геморой получается..
есть идеи?
:idontnow: :help: :idontnow:

Drakosha 03.07.2006 11:13

посмотри: man stat
например: stat -c %X d1

ЗЫ: все спасибы в карму ;)

crawler 04.07.2006 18:02

Есть такой файл (несколько параграфов начинающихся с ** и разделенных пустой строкой) :
Цитата:

** <какойто текст
на несколько линий>

** <еще какойто текст
на несколько линий>

** <еще какойто текст
на несколько линий>
Пробую выкинуть абзацы содержащие стринг 123456:
Код:

/^$/!{
    H
    d
    }
/^$/{
    x
  /123456/d
  G
}

или
Код:

:t
 /\*\*/,/^$/ {
    /^$/!{
      $!{
          N;
          bt
      }         
    }
    /123456/d;
 }

Не работает. Если же предположить что абзацы разделены "---" и искать вместо "^$" "---" - то все работает. В чем затык ???
Пользую sed 3.02 из UnixUtils под Винду.


Часовой пояс GMT +4, время: 11:55.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.