#!/bin/sh
awk -v value="$1" -v column="$2" '
$column == value {++removed; next}
1 {print}
END {print removed " lines removed" >"/dev/stderr"}
' <File.txt >File.txt.tmp &&
mv File.txt.tmp File.txt
Объяснения:
-v value="$1"
устанавливает awk переменную value
к первому аргументу сценария оболочки.$column == value
верно, код в фигурных скобках выполнен. $column
содержание номера столбца column
(запускающийся в 1).++removed
увеличивает счетчик удаленных строк. Переменная запускается в 0.next
пропуски к следующей входной строке, так, чтобы print
инструкция не будет выполняться, когда условие будет верно.1 {print}
печатает каждую строку, которая не вызвала next
директива, которая будет выполняться. (1
всегда истинное условие.)END {…}
выполняет код в фигурных скобках в конце входа.touch /var/log/bootcount
echo $[$(</var/log/bootcount)+1] > /var/log/bootcount
Добавьте это к /etc/rc.local
(или equiv для Вашей разновидности Linux)
(принятие системы sh
bash
)
Сохраните переменную в файл и затем считайте тот файл каждый раз начальные загрузки системы.
VAR=`cat ~/.foo`
echo $(($VAR + 1 )) > ~/.foo
Затем отредактируйте ~/.foo и войдите в 0
Необходимо будет поместить эту внутреннюю часть сценарий, который называют каждой начальной загрузкой. Каждый дистрибутив отличается.
Некоторое использование
init.d
выскочка
systemd
runinit
http://www.linux.org/threads/init-and-its-alternatives.4876/
.bashrc
будет работать на каждом вызове оболочки.
– Ricky Beam
07.02.2014, 07:01
cron
реализации как та от ISC также поддерживают рабочие вещи при начальной загрузке (на демона крона, запускающегося), который позволяет неадминистраторам выполнять вещи при начальной загрузке. (@reboot
в crontab).
– Stéphane Chazelas
07.02.2014, 09:58
Добавление строки, такой как это к системе rc.local
должен добиться цели:
$ touch count.txt; CNT=$(<count.txt); echo $(($CNT + 1)) > count.txt
То, где Вы хотите сохранить файл количества, ваше дело, просто переместитесь count.txt
или укажите его с помощью переменной или полного пути. Вышеупомянутое заботится о создании файла первый раз, когда это выполняется и продолжит увеличивать число в том файле каждый раз rc.local
выполняется.
Примечание: Использование $(<count.txt)
может представить проблему об определенных реализациях sh
, в тех ситуациях можно решить использовать $(cat count.txt)
вместо этого.
$ rm count.txt
$ touch count.txt; A=$(<count.txt); echo $(($A + 1)) > count.txt
$ cat count.txt
1
$ touch count.txt; A=$(<count.txt); echo $(($A + 1)) > count.txt
$ touch count.txt; A=$(<count.txt); echo $(($A + 1)) > count.txt
$ touch count.txt; A=$(<count.txt); echo $(($A + 1)) > count.txt
$ cat count.txt
4
sh
синтаксис. Многие sh
интерпретаторы во многих основанных на Linux системах не поддерживают тот синтаксис. На Unix. SE, если Вы предлагаете что-то нестандартное, необходимо указать на это. $(<file)
не является стандартным ни один согласно спецификации Основы программного обеспечения Linux.
– Stéphane Chazelas
07.02.2014, 10:02
$(cat count.txt)
удалил бы проблему, корректную?
– slm♦
07.02.2014, 10:06
Здесь я представляю функцию оболочки, которая читает файл и увеличивает значение, сохраненное в файле. Значение хранится в переменной count
. Наконец это записывает увеличенное значение обратно в файл.
#!/bin/sh
DATAFILEDIR='/var/cache/bootcount'
DATAFILE="$DATAFILEDIR"/count
update_data_file() {
if [ -w "$DATAFILE" ]; then
while IFS='=' read key value; do
case "$key" in
'count') count="$value" ;;
esac
done < "$DATAFILE"
else if [ ! -d "$DATAFILEDIR" ]; then
mkdir -p "$DATAFILEDIR"
count=1
fi fi
count=$(($count + 1))
echo "count=$count" > "$DATAFILE"
}
update_data_file
echo "Boot count is $count"
exit 0
Можно поместить сценарий в /usr/local/bin
и добавьте его к /etc/rc.local
.
sh
abash
оболочка является неправильной и перестала работать во многих случаях на всех видах систем. Можно ожидатьsh
быть оболочкой POSIX и ничем больше. Для сценариев, столь же простых как это, я настоятельно рекомендовал бы придерживаться POSIX для хранения его максимально портативным. об/мин – Marco 07.02.2014, 09:29echo "$(($(cat /var/log/bootcount) + 1))" > /var/log/bootcount
– Stéphane Chazelas 07.02.2014, 09:53bash
безопасная ставка. Истинная оболочка (ТМ) не имела бы никакой подобной причудливости, таким образом, нужно было бы обратиться кexpr
добираться там. (попробуйте solaris или Экс-ан-Прованс) – Ricky Beam 07.02.2014, 19:59