[командная строка, nix] выдрать из строки символов число
df | grep -v Filesystem | awk '{if ($5 > 95) print $0 }'
пасибо!
Или даже df | awk '$5>95' ?
Ты ж, вроде, любитель краткости?
---
...Я работаю антинаучным аферистом...
Если именно sed, то
sed -ne "/.*[^0-9][0-9]*Ы/s/.*[^0-9]\([0-9]*\)Ы/\1/p"
Работает даже не под униксом.
Наверняка ещё как-то можно упростить, что-то вроде
sed -ne "/.*[^0-9]\([0-9]*\)Ы/s//\1/p"
но точно не скажу, потому что седы разные бывают.
---
...Я работаю антинаучным аферистом...
а "Ы" это хто?
# df | awk '!/Filesystem/ && $5 > 95'
(ну или для ясности в тело дописать { print } )
2 : "Если символ не пробельный, то с авком будь осторожен." - это почему еще?
Пришел папа авка . POP3 сервер напишешь на авке?
это случаное предположение? или откуда знаешь?
Ничего не знаю. Просто слышал, что на awkе даже POP3 сервер какой-то фан написал.
так gawk (awk с доп. возможностями работы с сокетами и т.п.) вообще не сильно отличается по возможностям от перла, так что практически все, что можно написать на перле - можно написать и на gawk-е
Да чё там POP3-сервер на авке! Я вот слышал про интерпретатор Бейсика на ТеХе и веб-сервер на Постскрипте!
Сокеты не нужны. Сервер работает из под inetd, то есть с stdinом.
Иногда очень эффектных.
Хотя мысль сделать FS=[^0-9]+ тоже ничего.
Ещё я не пойму, зачем "!/Filesystem/".
Там у строк со словом Filesystem есть 5-е поле?
---
...Я работаю антинаучным аферистом...
/user/ && state_check_user { user=$2; }
/pass/ && state_check_pass { if($1=passwd[user]) ...; }
Наверняка что-то подобное.
---
...Я работаю антинаучным аферистом...
>Иногда очень эффектных.
что-то я совсем не понимаю о чем ты
(первая ассоциация с такой фразой: "когда пишешь скрипты будь осторожен с определением переменной N, потому что можно получить кучу ..." и далее по тексту - так можно про все что угодно сказать)
>Хотя мысль сделать FS=[^0-9]+ тоже ничего.
замечу это _не_моя_ мысль
можно вообще писать скрипты ни разу не обращаясь к FS (и даже RS
а если я правильно понял то, что ты хотел сказать вторым постом (про примеры с sed) и то что хочет автор треда - это _нужно_ сделать в один print к FS не обращаясь
>Ещё я не пойму, зачем "!/Filesystem/".
>Там у строк со словом Filesystem есть 5-е поле?
тот пост я писал не проверяя на системе, а только упростил вариант Глеба
не знаю как у тебя, но:
electr-t-134:~[18:39:54]>df
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/da0s1a 521838 40610 439482 8% /
/dev/da1s2e 1557616 372750 1060258 26% /VARTMP
/dev/da2s1e 8824220 2677392 5440892 33% /qs
/dev/da0s2e 3645172 1653322 1700238 49% /usr
/dev/ad0s1e 115394404 27531058 78631794 26% /wd
procfs 4 4 0 100% /proc
>> Иногда очень эффектных.
> что-то я совсем не понимаю о чем ты
Тогда как ты предполагал выбивать непробельный знак сразу после числа?
Использовать awk как sed?
>> Хотя мысль сделать FS=[^0-9]+ тоже ничего.
> замечу это _не_моя_ мысль
Не понял.
А что же ты предлагал?
На случай непробельного знака.
>> Ещё я не пойму, зачем "!/Filesystem/".
>> Там у строк со словом Filesystem есть 5-е поле?
> тот пост я писал не проверяя на системе, а только упростил вариант Глеба
> не знаю как у тебя, но:
Надо проверить, как производится сравнение.
Если надо, проставить ($5+0)>5 или что там ещё.
Кстати, исправить ошибку:
FS=[^0-9\n]+
---
You've got TECO. What more do you want?
>Использовать awk как sed?
нет, конечно! я предлагаю использовать awk как awk
(кстати, awk и sed примерно одного возраста)
`string' - строка в которой идет сначала требуемое число (впереди может быть любое кол-во blank символов а затем ненужная куча других символов
`+ string' - требуемое число (единствення, на мой взгляд, проблема, которая может здесь возникнуть - это перевод значения типа "([0-9]+)e[0-9]+.*" , если нужное нам число заключено в скобки (типа экспонента не нужна) - но тогда это обходится, например, gsub(/e[0-9]+/, "", string) )
>>> Хотя мысль сделать FS=[^0-9]+ тоже ничего.
>> замечу это _не_моя_ мысль
>А что же ты предлагал?
>На случай непробельного знака.
>Кстати, исправить ошибку:
>FS=[^0-9\n]+
для начала вспомним, что у нас есть не только целые числа (и что у нас десятичный разделитель?).
плюс, что ты собираешься делать со строкой после того как выделишь числа? ты знаешь сколько чисел стоит перед искомым? как ты определишь (после разбиения) за каким полем стоял тот "известный символ"? можно, конечно, и его исключить из regexp-a для FS, но как мне кажется, геморрой себе можно искать (и найти!) более простыми путями.
и вообще у нас довольно странная дискуссия происходит: мы не знаем о задаче практически ничего, но пытаемся о чем-то говорить: первый пост вообще по своей информативности ужасен - я бы точно на него не смог ответить - а судя по второму посту (и последующему ответу) Глеб умеет читать мысли (может как-нибудь научит?).
что значит "его положениие известно": фиксированное кол-во символов перед числом? полей (неизвестен разделитель)? известна комбинация символов перед числом? хорошо, что написал, что выдирать из строки, а из не файла, например.
остальное намного менее принципиально, но: какой символ после числа? пустой? управляющий (может, не дай бог, новая строка)? алфавитный, пунктуационный?
а вообще, и я могу написать что-то вроде:
gawk '/zhopa[[:digit:]\.]+Z/ {print + gensub(/.*zhopa([[:digit:]\.]+)Z.*/, "\\1", "g")}' filename
тогда в stdout оно будет валить числа из строк похожих на первый regexp, заключенных между zhopa и Z из файла filename
>>> Ещё я не пойму, зачем "!/Filesystem/".
>>> Там у строк со словом Filesystem есть 5-е поле?
>Надо проверить, как производится сравнение.
>Если надо, проставить ($5+0)>5 или что там ещё.
да, ты прав, в этом случае можно так (унитарный `+' конвертирует выражение в число, слово Capacity станет нулем):
df | awk '+ $5 > 5'
странно, что указав этот способ перевода `строка -> число' здесь, ты его не использовал выше
>>> замечу это _не_моя_ мысль
>>А что же ты предлагал?
>>На случай непробельного знака.
>>Кстати, исправить ошибку:
>>FS=[^0-9\n]+
> для начала вспомним, что у нас есть не только целые числа
> (и что у нас десятичный разделитель?).
Последнее время у меня числа только целые.
> плюс, что ты собираешься делать со строкой после того,
> как выделишь числа?
Верное замечание.
> можно, конечно, и его исключить из regexp-a для FS, но как мне кажется,
> геморрой себе можно искать (и найти!) более простыми путями.
Скажем так, изврат с RS=[ \t\r\n\f]+ придумывался изначально для других целей.
> а вообще, и я могу написать что-то вроде:
> gawk '/zhopa[[:digit:]\.]+Z/ {print + gensub(/.*zhopa([[:digit:]\.]+)Z.*/, "\\1", "g")}' filename
> тогда в stdout оно будет валить числа из строк похожих на первый regexp,
> заключенных между zhopa и Z из файла filename
Знаешь, в этом случае awk проигрывает sed-у.
Это уже изврат --- писать
awk '/Ё[[:digit:]\.]+Ы/ {print + gensub(/.*Ё([[:digit:]\.]+)Ы.*/, "\\1", "g")}'
вместо
sed -ne '/Ё[0-9.]+Ы/s/.*Ё\([0-9.]+\)Ы.*/\1\n/g'
или что ты имел в виду.
> да, ты прав, в этом случае можно так (унитарный `+' конвертирует
> выражение в число, слово Capacity станет нулем):
> df | awk '+ $5 > 5'
А команда-то всё короче и короче!
> странно, что указав этот способ перевода `строка -> число' здесь,
> ты его не использовал выше
"Сахару больше штефкать надо, сахар мозги укрепляет!"
---
...Я работаю антинаучным аферистом...
>Это уже изврат --- писать
маза сравнивать производительность, а не простоту написания
>или что ты имел в виду.
я надеюсь, что тоже, что и ты: я с sed-ом мало работал - поэтому я несколько упростил схему скрипта - чтобы не было ошибки в интерпретации производимых манипуляций:
[cluster:TMP]$ time awk '/Оud/ {print gensub(/.*/, "q", "g")}' EA_All_n.r.kr_mos.tgz
q
q
q
q
q
q
q
q
real 0m0.810s
user 0m0.670s
sys 0m0.060s
[cluster:TMP]$ time sed -ne '/Оud/ s/.*/q/g p' EA_All_n.r.kr_mos.tgz
q
q
q
q
q
q
q
q
real 0m5.170s
user 0m4.850s
sys 0m0.070s
это я скармливал ~40Мб файл, согласись: более чем в 6 раз отличие времен - это существенно
сам не проверял, но в нете пару раз натыкался на сравнения производительности awk/perl интерпретаторов (+ программы на разных языках написанные) на примере каких-то вычислений (непомню точно) - так awk примерно в 2-3 раза быстрее перла был
кстати, gensub - это расширение gawk-а, но в некоторых ОС gawk обзывают awk-ом
>> Это уже изврат --- писать
> маза сравнивать производительность, а не простоту написания
Я про простоту написания.
Производительность тоже важна, но ещё неизвестно, кто быстрее.
>> или что ты имел в виду.
> я надеюсь, что тоже, что и ты: я с sed-ом мало работал
Я больше с седом.
> EA_All_n.r.kr_mos.tgz
Есть предложение скармливать именно текстовый файл.
Всё-таки мы о таких задачах говорим.
Сед существенно заточен под тексты.
По посиксу, насколько помню, вообще можно ограничиться 4096 знаками на строку.
А у тебя что?
> сам не проверял, но в нете пару раз натыкался на сравнения
> производительности awk/perl интерпретаторов
> так awk примерно в 2-3 раза быстрее перла был
Я ещё встречал сравнение с седом в пользу последнего.
Тоже в какие-то разы.
> кстати, gensub - это расширение gawk-а, но в некоторых ОС gawk обзывают awk-ом
Просто незачем два имени держать.
Смысл?
---
...Я работаю антинаучным аферистом...
[aqua:4]$ time sed -ne '/51978/ s/.*/q/g p' ea_4_min_rdist_most.molden.out
q
q
q
q
q
q
real 0m2.052s
user 0m1.560s
sys 0m0.170s
[aqua:4]$ time awk '/51978/ {print gensub(/.*/, "q", "g")}' ea_4_min_rdist_most.molden.out
q
q
q
q
q
q
real 0m0.633s
user 0m0.610s
sys 0m0.030s
текстовый файл (10 Мб) разрыв сократили
>Я ещё встречал сравнение с седом в пользу последнего.
>Тоже в какие-то разы.
awk/sed? perl/sed?
>Просто незачем два имени держать.
>Смысл?
совместимость:
реализация awk намного менее зависит от платформы
в этом плане скрипты на gawk-e менее предпочтительны (у меня, в начале моего знакомства с авком, было кучу раз когда скрипт в системе FreeBSD 4.x работает, а в RedHat или, в последствии, Debian - нет и наоборот) - мало того, далеко не на всех системах он есть.
Ясно дело.
Седом не советуют обрабатывать двоичные данные.
>> Я ещё встречал сравнение с седом в пользу последнего.
>> Тоже в какие-то разы.
> awk/sed? perl/sed?
Искать надо, разбираться, а лень.
Может, пока отложим?
>> Смысл?
> совместимость:
...
> мало того, далеко не на всех системах он есть.
У меня другое отношение к переносимости.
Если надо перенести, то переносим всё вместе и правим по потребности.
Тем более, что для гнутых вещей это не является такой уж страшной задачей.
---
...Я работаю антинаучным аферистом...
Оставить комментарий
gsharov
выдрать из строки символов какое нибудь число (его положениие известно - и извесен символ после него)средства - tcsh , sed. Помогите плиз!