Я выполняю сервер Minecraft от debian терминала, и это - вероятно, неправильный способ сделать это, но он работает. Во-первых, sudo apt-get install screen
, затем сохраните следующий сценарий как /etc/init.d/minecraft
:
#!/bin/bash
case "$1" in
start)
screen -S minecraft /home/mc/server/craftbukkit.sh
echo "Server started on screen minecraft"
;;
stop)
screen -X -S minecraft kill
echo "Server shutting down"
;;
*)
echo "Usage: /etc/init.d/minecraft {start|stop}"
exit 1
;;
esac
exit 0
Теперь, выполните следующие команды как корень:
update-rc.d -f minecraft defaults
Это сделает сервер Minecraft выполненным в фоновом режиме когда начальные загрузки системы. Для просмотра консоли работать screen -x minecraft
в терминале. Для выхода из консоли нажмите Ctrl+A и затем D.
for file1 in log1.txt log2.txt logN.txt; do
for file2 in logA.txt logB.txt logC.txt; do
for file3 in logD.txt logE.txt logF.txt; do
match1=$(tail -n 5147 $file1 | grep -c 'The line');
match2=$(grep -c "the line" $file2);
match3=$(grep -c "the line" $file3);
echo "($match1 + $match2 + $match3) * 200" | bc;
done;
done;
done
Это будет считать случаи the line
в последних 5 147 строках каждого из $file1
s и сохраняют это как $match1
. Это будет затем считать случаи the line
в каждом из $file2
s и сохраняют его как match2
и количество случаев в каждом file3
как $match3
. Затем это вычислит ($match1 + $match2 + $match3) * 200
.
echo "$(tail -n 5147 Log1.log.2013-11-18 | grep -c 'The line') \
$(grep -c 'The line' Log2.log) $(grep -c 'The line' Log3.log)" |
awk '{print ($1+$2+$3)*200}'
Здесь существует несколько приемов. grep -c
количества соответствуют вместо того, чтобы печатать их, таким образом, никакая потребность в wc
. awk
может сделать математику, таким образом, никакая потребность в bc
. Я использую echo
вместо expr
потому что я не делаю арифметики в оболочке больше, просто повторив результаты трех поисков и передавая их awk
. Это должно привести к чему-то как:
echo "10 4 12" | awk '{print ($1+$2+$3)*200}'
echo $((($(tail -n 5147 Log1.log.2013-11-18 | grep -c "The line) + \
$(grep -c "The line" Log2.log) + $(grep -c "The lne" Log3.log)) * 200))
Это делает всю математику в оболочке, с помощью $(( ))
нотация. Можно попробовать его echo $((2*4))
. Не очень легко читать, это расширяется до:
echo "$(( ($file1_matches + $file2_matches + $file3_matches) * 200 ))"
Я думаю, что необходимо смочь просто добавить третий файл после второй кошки:
expr `tail -n 5147 Log1.log.2013-11-18 | grep "The line I need to count" | wc -l` + `cat Log2.log Log3.log | grep "The line I need to count" | wc -l` | awk '{print $1"*200"}' | bc
пример:
$ echo abc > 1.txt
$ echo cde > 2.txt
$ echo def > 3.txt
$ cat 1.txt 2.txt 3.txt | grep d
cde
def
Я решил аналогичную проблему с подсчетом строк в нескольких CSV-файлах.
У меня есть большой список CSV-файлов -вывод скрипта, так что поля у них одинаковые. Меня интересовало количество строк с допустимым значением.
Команда, которая сделала свое дело,
awk -F, '{if ($5>0.0) print $5}' va.2021-04-11.153123.csv va.2021-04-11.111709.csv | wc -l
-F,
устанавливает разделитель на,
(мои файлы CSV разделены ,
)'{if ($5>0.0) print $5}'
— это «сценарий», который сообщает awk
что делать :0.0
, то вывести 5-е поле wc
, который с флагом -l
будет подсчитывать строки в выводе va.2021-04-11.153123.csv va.2021-04-11.111709.csv
— разделенный пробелом -список из двух CSV-файлов
NR>5146
? Это проводит только последние 5 146 строк файла? – FGreg 20.11.2013, 04:19NR
специальное предложениеawk
переменная, которая содержит текущий номер строки. И поскольку я пишу этот комментарий, я понимаю, что это нисколько не, что Вы попросили, извините. Взгляните на обновленный ответ, все версии должны сделать то, что Вы хотите теперь, и я также добавил намного более короткий. – terdon♦ 20.11.2013, 05:02