AWK / SED - 为什么我的脚本无法在两个关键字之间找到子串

时间:2013-07-08 05:49:14

标签: bash command-line sed awk

考虑我的可执行文件的这个ldd输出:

    linux-gate.so.1 =>  (0x003a5000)
    libtcmalloc_minimal.so.0 => ./libtcmalloc_minimal.so.0 (0x00710000)
    libBIBusTK.so => ./libBIBusTK.so (0x00b68000)
    libCCLIDOM.so => ./libCCLIDOM.so (0x00a08000)
    libxcb.so.1 => /usr/lib/libxcb.so.1 (0x00357000)

这里我有趣的部分就是每一行中的子字符串:

                    ./libtcmalloc_minimal.so.0
                    ./libBIBusTK.so
                    ./libCCLIDOM.so
                    /usr/lib/libxcb.so.1

因此我使用awk来实现这一点,首先我尝试了:

ldd ./BIBusTKServerMain | awk -F "=>" '{print $2}'

它给了我“=>”之后的所有子字符串符号

然后我又尝试了一步:

ldd ./BIBusTKServerMain | awk -F "=>" '{print $2}' | awk -F "(0x" '{print $1}'

会抛出错误:

awk: fatal: Unmatched ( or \(: /(0x/

请注意,如果我试过这个:

ldd ./BIBusTKServerMain | awk -F "=>" '{print $2}' | awk -F "0x" '{print $1}'

它产生:

./libtcmalloc_minimal.so.0 (
./libBIBusTK.so (
./libCCLIDOM.so (
/usr/lib/libxcb.so.1 (

我的原始awk脚本出了什么问题? 我也尝试过sed替代方案:

sed -n '/=>/,/\(0x/p' lddInfo.txt

也不起作用......

3 个答案:

答案 0 :(得分:1)

以下sed应该有效:

ldd ./BIBusTKServerMain | sed 's/^.* => \([^ ]*\) .*$/\1/'

或者这个awk也可以工作:

ldd ./BIBusTKServerMain | awk '$3 ~ /^\.?\// {print $3}' 

答案 1 :(得分:1)

为什么不试试:

awk '{print $3}'

不使用它的原因是什么?

ldd ./BIBusTKServerMain | awk '{print $3}'

或者您也可以使用:

perl -lne 'print $1 if(/=\> ([^\s]*)\s/)'

答案 2 :(得分:0)

这可以在这里工作(在Windows下使用GnuSed,因此引号需要更改)

sed "s/ .* \(.*\) .*/\1/" test.txt