【问题标题】:Need help in executing the SQL via shell script and use the result set在通过 shell 脚本执行 SQL 和使用结果集时需要​​帮助
【发布时间】:2010-12-14 12:46:12
【问题描述】:

我目前有一个请求来构建一个 shell 脚本,以使用 SQL (Oracle) 从表中获取一些数据。我正在运行的查询返回多行。有没有办法使用结果集之类的东西?

目前,我正在将其重定向到一个文件,但我无法再次重用数据以进行进一步处理。


编辑:感谢吉恩的回复。结果文件如下所示:

UNIX_PID  37165
----------
PARTNER_ID  prad
--------------------------------------------------------------------------------
XML_FILE
--------------------------------------------------------------------------------
/mnt/publish/gbl/backup/pradeep1/27241-20090722/kumarelec2.xml


pradeep1
/mnt/soar_publish/gbl/backup/pradeep1/11089-20090723/dataonly.xml


UNIX_PID 27654
----------
PARTNER_ID  swam
--------------------------------------------------------------------------------
XML_FILE
--------------------------------------------------------------------------------
smariswam2
/mnt/publish/gbl/backup/smariswam2/10235-20090929/swam2.xml

有多个这样的行。我的要求只是使用shell脚本编写这个程序。

我需要获取每个 pid 并检查进程是否正在运行,这我可以处理。

我的问题是如何检查每个 PID,以便循环并获取相应的 partner_idxml_file 名称?既然是文件,我怎样才能得到准确的对应值呢?

【问题讨论】:

  • 你是否真的只限于使用 shell 脚本语言,如果是,什么 shell?

标签: sql unix shell scripting


【解决方案1】:

这是一种建议的方法。从您发布的示例中并不清楚,所以我假设这实际上是您的示例文件的样子:

UNIX_PID 37165 PARTNER_ID prad XML_FILE /mnt/publish/gbl/backup/pradeep1/27241-20090722/kumarelec2.xml pradeep1 /mnt/soar_publish/gbl/backup/pradeep1/11089-20090723/dataonly.xml
UNIX_PID 27654 PARTNER_ID swam XML_FILE smariswam2 /mnt/publish/gbl/backup/smariswam2/10235-20090929/swam2.xml

我还假设:

  1. 末尾有换行符 文件的最后一行。
  2. 列由单个分隔 空间。

这是一个建议的 bash 脚本(我敢肯定,这不是最佳的,但很实用):

#! /bin/bash
cat myOutputData.txt |
while read line;
do
    myPID=`echo $line | awk '{print $2}'`
    isRunning=`ps -p $myPID | grep $myPID` 
    if [ -n "$isRunning" ]
    then
        echo "PARTNER_ID `echo $line | awk '{print $4}'`"
        echo "XML_FILE `echo $line | awk '{print $6}'`"
    fi
done

脚本遍历输入文件的每一行(行)。它使用 awk 提取第 2 列(PID),然后进行检查(使用 ps -p)以查看进程是否正在运行。如果是,它会再次使用 awk 从文件中提取并回显两个字段(PARTNER ID 和 XML FILE)。您应该能够进一步调整脚本以满足您的需要。如果您想使用不同的列分隔符或进行额外的文本处理,请阅读 awk。

如果输出文件包含每个数据元素的一行(如您所指出的),事情会变得更加棘手。这里的一个好方法是在脚本中使用简单的状态机制,并“记住”最近看到的 PID 是否正在运行。如果是,则应打印出出现在下一个 PID 之前的任何数据元素。这是一个注释脚本,可以使用您提供的格式的文件来执行此操作。请注意,您必须在输入数据的最后一行末尾有换行符,否则最后一行将被删除。

#! /bin/bash
cat myOutputData.txt |
while read line;
do
    # Extract the first (myKey) and second (myValue) words from the input line
    myKey=`echo $line | awk '{print $1}'`
    myValue=`echo $line | awk '{print $2}'`

    # Take action based on the type of line this is
    case "$myKey" in
        "UNIX_PID")
            # Determine whether the specified PID is running
            isRunning=`ps -p $myValue | grep $myValue` 
        ;;
        "PARTNER_ID")
            # Print the specified partner ID if the PID is running
            if [ -n "$isRunning" ]
            then
                echo "PARTNER_ID $myValue"
            fi
        ;;
        *)
            # Check to see if this line represents a file name, and print it
            # if the PID is running
            inputLineLength=${#line}
            if (( $inputLineLength > 0 )) && [ "$line" != "XML_FILE" ] && [ -n "$isRunning" ]
            then
                isHyphens=`expr "$line" : -`
                if [ "$isHyphens" -ne "1" ]
                then
                     echo "XML_FILE $line"
                fi
            fi
        ;;
    esac
done

我认为我们现在已经很好地进入了定制软件开发领域,所以我将不再讨论。您应该有足够的空间来根据自己的喜好自定义脚本。祝你好运!

【讨论】:

  • 这看起来不错..但是结果文件没有单行中的所有值...在 shell 脚本中有一种方法可以在一个变量中获取查询结果并使用它就像结果集。
【解决方案2】:

您的问题在细节上非常简短(您已将查询输出重定向到的文件示例会有所帮助,以及您对数据实际想要做什么的一些想法),但一般来说方法,一旦您将查询结果保存在文件中,为什么不使用您选择的脚本语言(ruby 和 perl 都是不错的选择)来解析文件并对每一行执行操作?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-23
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    相关资源
    最近更新 更多