[bash] как сравнить два текстовых файла

Тема в разделе "Другие языки", создана пользователем HEPB, 19 фев 2012.

Модераторы: Цукер
  1. HEPB

    HEPB Постоялец

    Регистр.:
    24 июн 2009
    Сообщения:
    111
    Симпатии:
    8
    Есть такой код:


    PHP:
    #!/bin/bash
     
    filename=/var/s1.cfg
    filename1
    =/var/s1.bak
    filesize
    =$(stat -c%"$filename")
    filesize1=$(stat -c%"$filename1")
     
     
    if [ 
    "$filesize"$filesize1];
    then
    exit 0
    else
    # тут всякие команды
     
     
    cp /var/s1.cfg  /var/s1.bak
     
    fi
    То есть смысл в чем. Надо выполнить "всякие команды", если что-то изменилось в файле /var/s1.cfg с момента последнего выполнения данного скрипта.
    Для этих целей придумано создавать bak-файл этого /var/s1.cfg и сравнивать на размер.
    Это все хорошо, но возможны ситуации, что размер не изменился, но содержимое файла изменилось.
    Можно было бы сравнивать даты создания файлов cfg и bak, однако команда cp создает файл с новой датой, а не датой создания файла - оригинала.
    Выходов два: 1) сравнивать содержимое файлов, что думаю не очень рационально, размеры файлов могут быть большими (до 400-500 кБт); 2) во втором файле хранить не содержимое первого файла, а дату и время его создания и если оно отличается, то произвести действия и сохранить новое время и дату создания.


    Возможно ли такое сделать на shell-скрипте. Помогите, пожалуйста с реализацией данного скрипта.
     
  2. porsche2

    porsche2

    Регистр.:
    18 ноя 2007
    Сообщения:
    667
    Симпатии:
    210
    Код:
    #!/bin/sh
     
    if diff file1 file2 >/dev/null ; then
      echo OK
    else
      cp /orig/file ~/file1
    fi
    
    еще посмотри в сторону cmp Перейти по ссылке
     
    HEPB нравится это.
  3. HEPB

    HEPB Постоялец

    Регистр.:
    24 июн 2009
    Сообщения:
    111
    Симпатии:
    8
    появилась еще одна нужда. Сравнить кол-во строк в двух текстовых файлах. Если в однм файле кол-во строк меньше, чем в другом, то выполнить некоторые действия. Как узнать кол-во строк в текстовом файле?
     
  4. porsche2

    porsche2

    Регистр.:
    18 ноя 2007
    Сообщения:
    667
    Симпатии:
    210
    wc -l считает строки в файле, когда посчитаешь, сравниваешь, и с помошью if задаешь действие

    число_1 -eq число_2 - истина, если числа равны.
    число_1 -ne число_2 - истина, если числа не равны.
    число_1 -gt число_2 - истина, если первое число больше второго.
    число_1 -ge число_2 - истина, если первое число больше или равно второму.
    число_1 -lt число_2 - истина, если первое число меньше второго.
    число_1 -le число_2 - истина, если первое число меньше или равно второму.
     
    HEPB нравится это.
  5. HEPB

    HEPB Постоялец

    Регистр.:
    24 июн 2009
    Сообщения:
    111
    Симпатии:
    8
    А синтаксис какой не подскажите?
    присвоить переменной кол-во строк в файле /etc/var/file.txt
    Как прописать?
     
  6. porsche2

    porsche2

    Регистр.:
    18 ноя 2007
    Сообщения:
    667
    Симпатии:
    210
    да какой там синтакис :)

    #!/bin/bash
    a= wc -l < /etc/var/file.txt
    echo $a
     
    HEPB нравится это.
  7. HEPB

    HEPB Постоялец

    Регистр.:
    24 июн 2009
    Сообщения:
    111
    Симпатии:
    8
    еще вопрос возник. можно ли как то проверять, запущен ли такой-то процесс и если нет, то запустить его?
     
  8. uNknownMark

    uNknownMark

    Регистр.:
    22 сен 2007
    Сообщения:
    393
    Симпатии:
    169
    Похоже как то так:
    your_needed_name нужное название
    Код:
    #!/bin/bash
     
    if ps ax | grep your_needed_name | grep -vq grep
    then
      echo " your_needed_name  is already running"
    else
      echo "starting  your_needed_name"
      ./your_needed_name
    fi
    Вот еще готовый вариант Перейти по ссылке
     
    HEPB нравится это.
  9. HEPB

    HEPB Постоялец

    Регистр.:
    24 июн 2009
    Сообщения:
    111
    Симпатии:
    8
    Вариант uNknownMark работает, только у меня один из процессов вроде как зависает время от времени. Понять не могу почему, видимо что-то с железом связано, на втором серевере аналогичном таких проблем не возникало. В результате проверка
    if ps ax | grep your_needed_name | grep -vq grep
    не срабатывает.
    можно ли в условии еще прописать, что процесс не завис?
     
  10. noxwell

    noxwell Создатель

    Регистр.:
    23 июн 2011
    Сообщения:
    13
    Симпатии:
    9
    Код:
    if [ `ps -C your_proc_name | wc -l` != 1 ]; then echo "OK"; fi;
    Это проверит, запущен ли процесс. На зависание хз как в общем случае проверять, это зависит от процесса.