Не забывайте iostat, часть sysstat пакета. Если Вы хотите что-то, что легко портативный, почему бы не записать оболочке или сценарию Perl, который можно разрабатывать со временем? Это было бы хорошим способом изучить различия между системами и поправиться в сценариях. Можно обычно анализировать большую часть информации из proc или просто оборачивать все те инструменты.
cmd | while read line; do echo "[ERROR] $line"; done
имеет преимущество только использования удара builtins, таким образом, меньше процессов будет создано/уничтожено так, это должно быть касание быстрее, чем awk или sed.
@tzrik указывает, что мог бы также сделать хорошую функцию удара. Определение его как:
function prepend() { while read line; do echo "${1}${line}"; done; }
позволил бы этому использоваться как:
cmd | prepend "[ERROR] "
Попробуйте это:
cmd | awk '{print "[ERROR] " $0}'
Удачи
cmd | sed 's/.*/[ERROR] &/'
I wanted a solution that handled stdout and stderr, so I wrote prepend.sh
and put it in my path:
#!/bin/bash
prepend_lines(){
local prepended=$1
while read line; do
echo "$prepended" "$line"
done
}
tag=$1
shift
"$@" > >(prepend_lines "$tag") 2> >(prepend_lines "$tag" 1>&2)
Now I can just run prepend.sh "[ERROR]" cmd ...
, to prepend "[ERROR]" to the output of cmd
, and still have stderr and stdout separate.
При всем уважении к @grawity, я отправляю его комментарий в качестве ответа, поскольку мне кажется, что это лучший ответ.
sed 's/^/[ERROR] /' cmd
Я создал репозиторий GitHub для выполнения некоторых тестов скорости.
Результат:
awk
быстрее всех. sed
немного медленнее и perl
не намного медленнее, чем sed
. Очевидно, что все это сильно оптимизированные языки для обработки текста.ksh
скрипта (shcomp
) может сэкономить еще больше времени на обработку. Напротив, bash
является мертвым медленным по сравнению с компилированным ksh
скриптов. awk
, кажется, не стоит усилий. В отличие от python
является мертвым медленным, но я не тестировал скомпилированный случай, потому что это, как правило, не то, что вы бы сделали в таком случае сценариев.
Тестируются следующие варианты:
while read line; do echo "[TEST] $line"; done
while read -r line; do echo "[TEST] $line"; done
while read -r line; do echo "[TEST]" $line; done
while read -r line; do echo "[TEST]" "$line"; done
sed 's/^/[TEST] /'
awk '{ print "[TEST] " $0 }'
awk -vT="[TEST] " '{ print T $0 }'
awk -vT="[TEST]" '{ print T " " $0 }'
awk -vT="[TEST]" 'BEGIN { T=T " "; } { print T $0 }'
T="[TEST] " awk '{ print ENVIRON["T"] $0 }'
T="[TEST]" awk '{ print ENVIRON["T"] " " $0 }'
T="[TEST]" awk 'BEGIN { T=ENVIRON["T"] " " } { print T $0 }'
perl -ne 'print "[TEST] $_"'
Два бинарных варианта одного из моих инструментов (он не оптимизирован под скорость, однако):
./unbuffered.dynamic -cp'[TEST] ' -q ''
./unbuffered.static -cp'[TEST] ' -q ''
Python буферизован:
python -uSc 'import sys
for line in sys.stdin: print "[TEST]",line,'
А Python не буферизован:
python -uSc 'import sys
while 1:
line = sys.stdin.readline()
if not line: break
print "[TEST]",line,'
cmd | xargs -L 1 -i echo "prefix{}"
или даже проще в случае, если префикс
отделен пробелами от самой строки
cmd | xargs -L 1 echo prefix
Это не очень эффективно с точки зрения производительности, но коротко для записи.
Он работает, выполняя echo
один раз для каждой строки ввода. xargs
позволяет также обрабатывать \ 0
-разделенные строки.
sed
) или даже не представляют разделение в виде строки (awk
), используются.) – grawity 9 October 2009 в 10:52