linux - 给定行范围时如何使用 sed 命令从文本文件中提取内容?

标签 linux bash shell sed

#!/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 命令中传递变量

最佳答案

sed 命令出现的主要问题是因为您单引号 中的变量:

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

当你单引号变量时,你阻止了 shell 的变量扩展,所以 sed 从字面上看:

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

它尝试从字符 '$' 'L' 'I' 'N' 'E' '_' 'C' 解析文字范围 $LINE_COUNT_OLD, $LINE_COUNT '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 变量名。这些通常保留供 shell 使用。

关于linux - 给定行范围时如何使用 sed 命令从文本文件中提取内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53019378/

相关文章:

linux - 如何从文件[shell]中某些特定行的末尾删除\n?

c - 等待子执行

django - 由于 “grep -v”带有尾随\r,因此在构建Django应用程序时,Docker编写失败

linux - 如何在已打开的特定终端上启动 shell 命令?

linux - rpmbuild 设置错误的文件所有权说 root :root (wrong owner/group build:users)

c - 监听两个不同套接字接口(interface)的服务器程序

linux脚本移动目录中的文件和数据

linux - 你如何比较数组的值和 bash 脚本中的变量?

bash - -bash : mongo: command not found AWS

bash - 如何使用脚本创建一个到 Stratum 的套接字?