LINUX.ORG.RU

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


0

2

Есть Bash скрипт(freebsd), который дает вот такой результат, в этих данных нужно блоки текста в которых значение capacity меньше или равно 10 заключать в теги к примеру:

mac: 10:9F:22:33:11:00
name : SomeName
lastip : 192.168.15.198
txpower : 56
quality : 24
capacity : 73 
mac: 10:9F:22:33:11:99
name : SomeName
lastip : 192.168.15.147
txpower : 56
quality : 37
capacity : 26 
<div style="color: red;">
mac: 10:9F:22:33:11:88
name : SomeName
lastip : 192.168.15.99
txpower : 56
quality : 93
capacity : 10
</div> 


Последнее исправление: TesterTester (всего исправлений: 2)
  • 1. каждую очередную строку запоминаешь в некотором буфере.
  • 2. если прочитанная строка не начинается со слова capacity то переходишь к шагу 1.
  • 3. разделяешь полученную строку по пробелам.
  • 4. если последний элемент разделенной строки меньше или равен 10, то переходишь к шагу 6.
  • 5. выводишь все данные из буфера записанного в шаге 1 и переходишь к шагу 1.
  • 6. выводишь открывающий тег, затем буфер из шага 1 и закрывающий тег.
  • 7. переходишь к шагу 1.

по ходу реализации найди ошибку.

anonymous
()

без буфера: выворачиваешь текст командой tac, проставляешь теги и снова tac

sdio ★★★★★
()
Ответ на: комментарий от megabaks
tac 1.txt | awk '$1 == "capacity" && div 
                  { div=0; 
                    print "<div style=\"color: red;\">"
                  };
                $1 == "capacity" && $3 <= 10 
                 { print "</div>";
                   div=1
                 }; 
                 { print }
             END { if (div) {print "<div style=\"color: red;\">" }}' | tac
mac: 10:9F:22:33:11:00
name : SomeName
lastip : 192.168.15.198
txpower : 56
quality : 24
capacity : 73 
mac: 10:9F:22:33:11:99
name : SomeName
lastip : 192.168.15.147
txpower : 56
quality : 37
capacity : 26 
<div style="color: red;">
mac: 10:9F:22:33:11:88
name : SomeName
lastip : 192.168.15.99
txpower : 56
quality : 93
capacity : 10
</div>
sdio ★★★★★
()
Последнее исправление: sdio (всего исправлений: 3)
Ответ на: комментарий от megabaks

Элементарно же, всего два условия. нашли слово capacity, закрыли предыдущий блок (если он был открыт - флаг div=1) и сбросили флаг в 0, если значение <= 10, то открыли тег и пометили флаг div=0

sdio ★★★★★
()
Ответ на: комментарий от sdio

возможно отклонения у тебя

я этого не исключаю

megabaks ★★★★
()
Ответ на: комментарий от TesterTester

ну когда ты получил свои значения

TAG=
if (( capacity <= 10 )); then
  TAG="yes"
  echo '<div style="color: red;">'
fi

# печать

[ "$TAG" ] && echo '</div>'
emulek
()

в одну строку

Правильнее, конечно, изначальный скрипт исправить, чтобы он всё показывал как надо. Но если сильно нужно, то можно и в одну строку.

$ awk '{if ($1 == "mac:" ) t = $0 "\n"; else {t = t $0 "\n"; if ($1 == "capacity") { if ($3 <= 10) print "<div style=\"color: red;\">\n" t "</div>\n"; else print t}}}' inp1.txt
mac: 10:9F:22:33:11:00
name : SomeName
lastip : 192.168.15.198
txpower : 56
quality : 24
capacity : 73 

mac: 10:9F:22:33:11:99
name : SomeName
lastip : 192.168.15.147
txpower : 56
quality : 37
capacity : 26 

<div style="color: red;">
mac: 10:9F:22:33:11:88
name : SomeName
lastip : 192.168.15.99
txpower : 56
quality : 93
capacity : 10
</div>

justAmoment ★★★★★
()
Ответ на: комментарий от megabaks

ну...awk писали стопудово люди с отклонениями.

И продолжают использовать только люди с отклонениями.

Я давно все свои скрипты перевел на руби, выкинув всю эту awk-sed-find-grep-xargs-лапшу. Ни разу не пожалел.

anonymous
()
Ответ на: в одну строку от justAmoment

Огромное спасибо! под FreeBsd данный код работает!! Но на устройстве на котором мне необходимо его запустить он не работает, просто отрабатывает и ничего не выводит, вот информация о системе:

BusyBox v1.11.2 (2012-10-12 17:12:28 EEST) multi-call binary

Usage: awk [OPTION]... [program-text] [FILE...]

Options:
        -v var=val      Set variable
        -F sep          Use sep as field separator
        -f file         Read program from file




Видимо урезанный awk, или если есть отличия между awk в BSD системах и в Linux системах?
TesterTester
() автор топика
Ответ на: комментарий от TesterTester

Видимо урезанный awk, или если есть отличия между awk в BSD системах и в Linux системах?

Ну, запускай по частям. Смотри, что срабатывает, а что нет.

У меня только один вопрос. Почему нет пробела между «mac» и двоеточием? Это же нарушает структуру форматирования в три колонки, как для других параметров.

justAmoment ★★★★★
()
Ответ на: в одну строку от justAmoment

да лучше не в одну

awk '
$1=="mac:"     { t = "" }
               { t = t $0 "\n" }
$1!="capacity" { next }
$3<=10         { t = "<div style=\"color: red;\">\n" t "</div>" }
               { printf t }
' inp1.txt

anonymous
()
Ответ на: комментарий от anonymous

аналог на bash

#!/bin/bash

cat inp1.txt |
while read i; do
  a=($i)
  if [ "${a[0]}" == "mac:" ]; then t=""; fi
  t="$t$i\n"
  if [ "${a[0]}" != "capacity" ]; then continue; fi
  if [[ "${a[2]}" -le "10" ]]; then
    t="<div style=\"color: red;\">\n$t</div>"
  fi
  echo -e -n $t
done

anonymous
()
Ответ на: комментарий от anonymous

на sh

#!/bin/sh

cat in.txt |
while read i; do
  name=${i%%:*}
  value=${i##*: }
  if [ "$name" = "mac" ]; then t=""; fi
  t="$t$i\n"
  if [ "$name" != "capacity " ]; then continue; fi
  if [ "$value" -le "10" ]; then
    t="<div style=\"color: red;\">\n$t</div>"
  fi
  echo -n $t
done

anonymous
()

Если бы sam умел в потоковый ввод/вывод и ленивые регулярки, можно было бы сделать просто

sam -e 'x/mac:.*?\ncapacity.*?\n/ g/capacity : (10|.)\n/ s/^(.*)$/<div style="color: red;">\1<\/div>/' 
Но увы, пока полноценной утилиты для обработки текста так никто и не запилил.

quantum-troll ★★★★★
()
Ответ на: комментарий от quantum-troll

умел в потоковый ввод/вывод

man ssam, неофит

s/^(.*)$/

&

ssam 'x/^mac:(.|\n[^c])*\ncapacity[ :]*([0-9]|10)$/ s::<div>\n&\n</div>:'

// но лучше awk-ом

anonymous
()
Ответ на: комментарий от Pinkbyte

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

Я не знаю, чем упарывались аццы, но awk не нужен.

anonymous
()
Ответ на: комментарий от anonymous

printf t

В имени интерфейса % не может быть?

anonymous
()
Ответ на: комментарий от anonymous

милликостыли и гигакостыли...

Всё есть яд, и всё есть лекарство, в зависимости от дозы.

anonymous
()
Ответ на: комментарий от anonymous
ssam -e 'x/mac:.*?\ncapacity.*?\n/ g/capacity : (10|.)\n/ s/^(.*)$/<div style="color: red;">\1<\/div>/' 

ssam в этом busybox у меня к сожалению нет.

#!/bin/sh

cat in.txt |
while read i; do
  name=${i%%:*}
  value=${i##*: }
  if [ "$name" = "mac" ]; then t=""; fi
  t="$t$i\n"
  if [ "$name" != "capacity " ]; then continue; fi
  if [ "$value" -le "10" ]; then
    t="<div style=\"color: red;\">\n$t</div>"
  fi
  echo -n $t
done
#!/bin/bash

cat inp1.txt |
while read i; do
  a=($i)
  if [ "${a[0]}" == "mac:" ]; then t=""; fi
  t="$t$i\n"
  if [ "${a[0]}" != "capacity" ]; then continue; fi
  if [[ "${a[2]}" -le "10" ]]; then
    t="<div style=\"color: red;\">\n$t</div>"
  fi
  echo -e -n $t
done
awk '
$1=="mac:"     { t = "" }
               { t = t $0 "\n" }
$1!="capacity" { next }
$3<=10         { t = "<div style=\"color: red;\">\n" t "</div>" }
               { printf t }
' inp1.txt

Спасибо ! за примеры!) жесткие тут дискусии начались) прерву всех и спрошу еще... я переделал скрипт и сделал вывод в одну строку(xargs -b мне помог)

формат вывода следующий:

mac: 24:A4:3C:74:C0:49 name : SomeSome1 lastip : 192.168.1.178 txpower : 56 quality : 97 capacity : 95
mac: DC:9F:DB:62:10:BF name : SomeSome2 lastip : 192.168.1.58 txpower : 56 quality : 97 capacity : 11
mac: DC:9F:DB:3E:25:D8 name : SomeSome3 lastip : 192.168.1.48 txpower : 56 quality : 74 capacity : 10

TesterTester
() автор топика
Ответ на: комментарий от anonymous

И продолжают использовать только люди с отклонениями.

эм...ну по полям он куда грамотней того же cut разбирает

echo "1  2     3" | cut -f2
3
vs
echo "1  2     3" | awk '{print $2}'
2
мать его, лор!
между 1 и 2 два пробела, а между 2 и 3 таб

megabaks ★★★★
()
Последнее исправление: megabaks (всего исправлений: 1)
Ответ на: комментарий от anonymous
[ megabaks@desktop ] ~ $ echo "1  2     3" | cut -f2 -d" "

[ megabaks@desktop ] ~ $ echo "1  2     3" | cut -f2 -d" "2
cut: разделитель должен быть одним символом
По команде «cut --help» можно получить дополнительную информацию.
[ megabaks@desktop ] ~ $ 
[ megabaks@desktop ] ~ $ echo "1  2     3" | cut -d " " -f2

ЧЯДНТ?
прозреваю теоретика
ах ты ж - ты даже читать не умеешь - куда тебе мне что-то объяснять...

megabaks ★★★★
()
Последнее исправление: megabaks (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.