Как извлечь содержимое из текстового файла с помощью команды sed, если заданы диапазоны строк? - PullRequest
0 голосов
/ 27 октября 2018
#!/bin/bash

export ORACLE_SID=orcl
export ORACLE_BASE=/u01/app/oracle
export LOG_DIR=$ORACLE_BASE/diag/rdbms/$ORACLE_SID/$ORACLE_SID/trace

LINE_COUNT_OLD=0

while true
do  
    LINE_COUNT=`wc -l $LOG_DIR/alert_orcl.log | awk '{print $1}'`
    DIFF=`expr $LINE_COUNT - $LINE_COUNT_OLD`
    if [ $DIFF -ne 0 ] && [ $LINE_COUNT_OLD -ne 0 ]
    then
        COUNT=0
        COUNT=`tail -$DIFF $LOG_DIR/alert_orcl.log|grep 'ORA-'|wc -l`
        if [ $COUNT -ne 0 ]
        then
            sed -n '$LINE_COUNT_OLD, $LINE_COUNT' $LOG_DIR/alert_orcl.log > $LOG_DIR/alert_orcl_tmp.log
            cat $LOG_DIR/alert_orcl_tmp.log >> $LOG_DIR/alert_orcl_email.log
        fi
    fi
    sleep 10
    LINE_COUNT_OLD=$LINE_COUNT
    rm -f $LOG_DIR/alert_orcl_tmp.log 
done

В приведенном выше скрипте bash появляется ошибка ниже

sed: -e expression #1, char 3: extra characters after command

Итак, у меня есть проблема с командой sed -n.Но заменив переменные числами, такими как строка ниже, эта команда работает нормально

sed -n '6512, 6671 p' $LOG_DIR/alert_orcl.log

Нужна помощь для передачи переменной в команду sed -n

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

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

sed -n "$varA, $varB" $LOG_DIR/alert_orcl.log
0 голосов
/ 27 октября 2018

Ваша основная проблема с командой sed возникает из-за одинарных кавычек переменных в:

sed -n '$LINE_COUNT_OLD, $LINE_COUNT' ...

Когда вы одинарных кавычек переменныхВы предотвращаете расширение переменной оболочкой, поэтому sed буквально видит:

sed -n '$LINE_COUNT_OLD, $LINE_COUNT' ...

, где он пытается разрешить буквальный диапазон $LINE_COUNT_OLD, $LINE_COUNT из символов '$' 'L' 'I' 'N' 'E' '_' 'C' 'O' 'U' 'N' 'T' '_' 'O' 'L' 'D', ...

Чтобы исправить проблему, двойная кавычка переменные:

sed -n "$LINE_COUNT_OLD, $LINE_COUNT" ...

Далее у вас есть несколько мелочей, которые вы должны обновить.Во-первых, избегайте использования expr $LINE_COUNT - $LINE_COUNT_OLD, который является устаревшим (и медленным) способом выполнения арифметики.Вместо этого используйте арифметические операторы $((LINE_COUNT - LINE_COUNT_OLD)) ( примечание: $ разыменование переменных в $((..)) не требуется)

Далее, если вы не знаете точную причину не заключать в кавычки,Вы должны двойные кавычки всех переменных в bash, чтобы предотвратить разбиение слов .Особенно в пределах [...].В противном случае, если в вашей переменной есть пробелы, вы будете передавать неверное количество аргументов test.Кроме того, также неплохо бы заключать в кавычки непеременные с [...], например -ne '0' ( одинарные кавычки здесь хорошо).

Наконец, избегайте использованияALLCAPS имена переменных.Обычно они зарезервированы для использования оболочкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...