【问题标题】:(ASK) Grep by Regex and read per line with BASH(ASK) 使用 Regex 进行 Grep 并使用 BASH 读取每行
【发布时间】:2011-09-21 03:55:55
【问题描述】:

我有几个文件是

调解和 smsgw中介

我使用这个脚本来提取结果并将其放入 tmp.txt

for file in `ls -1 ocsmediation.log.$DATE-*`
do
    Get OCSID
    cd $DIRLOG
    OCSID=$(tr " " "\n" < ocsmediation.log.2011-09-19-00 | egrep "ocs[0-9][0-9][0-9]+")
    cd $CURDIR
    echo $OCSID >> tmp.txt
done

接下来我需要使用 tmp.txt 的结果作为我的第二个脚本的输入

cd $CURDIR
tr " " "\n" < tmp.txt


    cd $DIRLOG
    for file in `ls -1 smsgwmediation.log.$DATE-*`
    do
        cd $CURDIR
        cat tmp.txt | while read ID ; do

            SENDMSG=`awk '$0>=from&&$0<=to' from="$DATE $HR:$MIN" to="$DATE $HR:$MAX" $file | grep "$ID" |grep "Send" | wc -l`
            echo "$file: $SENDMSG: $ID" >> $CURDIR/sampl_send.$DATE.txt


        done 
    done

现在 sampl_send>$DATE.txt 没有创建,也没有错误。仅供参考 tmp.txt 包含如下行:

ocsid143243324, ocsid34543543534, bla bla 这就是为什么我使用 tr 将空格转换为换行符,这样我就可以逐行读取 ocsid

我只是不明白为什么我没有得到想要的结果 (sampl_send>$DATE.txt) 哦,上面的脚本只是我真实脚本中的 sn-ps,所以你不会看到像

这样的标准行
#!/usr/bin/bash

谢谢你

【问题讨论】:

  • 旁注:你不需要'for file in ls -1 ocsmediation.log.$DATE-*'...这可以表示为'for file in ocsmediation.log.$DATE-*'。

标签: regex bash solaris


【解决方案1】:

cd 来来回回非常难以理解。您的输入文件使用相对路径,因此当您更改到其他目录时它们“不再存在”,而且(不完整/无效)结果文件可能不在您期望的位置。但这很容易解决;将脚本转换为不更改目录,和/或使用文件的绝对路径。

【讨论】:

    【解决方案2】:

    我认为问题是引用问题...

    OCSID=$(tr " " "\n" < ocsmediation.log.2011-09-19-00 | egrep "ocs[0-9][0-9][0-9]+")
    

    $OCSID 将只包含直到 IFS 中第一个字符的字符串...如果您引用它...

    OCSID="$(tr ' ' '\n' < ocsmediation.log.2011-09-19-00 | egrep 'ocs[0-9][0-9][0-9]+')"
    

    然后 $OCSID 将包含整个字符串。以后……

    echo $OCSID >> tmp.txt
    

    这是必须的

    echo "$OCSID" >> tmp.txt
    

    【讨论】:

      猜你喜欢
      • 2017-09-24
      • 2018-03-08
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多