Постепенное увеличение переменной каждый раз начальные загрузки системы

#!/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 {…} выполняет код в фигурных скобках в конце входа.
  • Код awk пишет во временный файл, который затем перемещен в место.
2
07.02.2014, 09:53
4 ответа
touch /var/log/bootcount
echo $[$(</var/log/bootcount)+1] > /var/log/bootcount

Добавьте это к /etc/rc.local (или equiv для Вашей разновидности Linux)

(принятие системы sh bash)

0
27.01.2020, 22:06
  • 1
    Принятие этого sh a bash оболочка является неправильной и перестала работать во многих случаях на всех видах систем. Можно ожидать sh быть оболочкой POSIX и ничем больше. Для сценариев, столь же простых как это, я настоятельно рекомендовал бы придерживаться POSIX для хранения его максимально портативным. об/мин –  Marco 07.02.2014, 09:29
  • 2
    @Marco, согласованный, и тот же самый код, так же легок записать с POSIX sh синтаксис: echo "$(($(cat /var/log/bootcount) + 1))" > /var/log/bootcount –  Stéphane Chazelas 07.02.2014, 09:53
  • 3
    Это отмечено "Linux", таким образом, bash безопасная ставка. Истинная оболочка (ТМ) не имела бы никакой подобной причудливости, таким образом, нужно было бы обратиться к expr добираться там. (попробуйте solaris или Экс-ан-Прованс) –  Ricky Beam 07.02.2014, 19:59

Сохраните переменную в файл и затем считайте тот файл каждый раз начальные загрузки системы.

VAR=`cat ~/.foo`
echo $(($VAR + 1 )) > ~/.foo

Затем отредактируйте ~/.foo и войдите в 0

Необходимо будет поместить эту внутреннюю часть сценарий, который называют каждой начальной загрузкой. Каждый дистрибутив отличается.

Некоторое использование

init.d
выскочка
systemd
runinit

http://www.linux.org/threads/init-and-its-alternatives.4876/

3
27.01.2020, 22:06
  • 1
    "на начальной загрузке" И .bashrc будет работать на каждом вызове оболочки. –  Ricky Beam 07.02.2014, 07:01
  • 2
    @RickyBeam я понял, что моменты назад и обновил ответ. Спасибо за указание на это. –  spuder 07.02.2014, 07:02
  • 3
    Некоторые 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
0
27.01.2020, 22:06
  • 1
    $(<file) не POSIX. –  Stéphane Chazelas 07.02.2014, 09:55
  • 2
    @StephaneChazelas - Вы просто заявляете то право?, я не видел, что как требование в Q и это отмечено как Linux, таким образом, я предполагал, что стандартные инструменты были справедливой игрой. –  slm♦ 07.02.2014, 09:58
  • 3
    при помещении этого в sh файл как большинство сценариев запуска, необходимо использовать sh синтаксис. Многие sh интерпретаторы во многих основанных на Linux системах не поддерживают тот синтаксис. На Unix. SE, если Вы предлагаете что-то нестандартное, необходимо указать на это. $(<file) не является стандартным ни один согласно спецификации Основы программного обеспечения Linux. –  Stéphane Chazelas 07.02.2014, 10:02
  • 4
    @StephaneChazelas, изменяя ту команду на $(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.

0
27.01.2020, 22:06

Теги

Похожие вопросы