1

考虑我的可执行文件的这个 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

也不行...

4

3 回答 3

1

你为什么不简单地尝试:

awk '{print $3}'

不使用它的原因是什么?

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

或者您也可以使用:

perl -lne 'print $1 if(/=\> ([^\s]*)\s/)'
于 2013-07-08T05:53:31.950 回答
1

以下 sed 应该可以工作:

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

或者这个 awk 也可以工作:

ldd ./BIBusTKServerMain | awk '$3 ~ /^\.?\// {print $3}' 
于 2013-07-08T05:52:49.010 回答
0

这在这里有效(Windows下的GnuSed,因此引号需要更改)

sed "s/ .* \(.*\) .*/\1/" test.txt
于 2013-07-08T09:20:15.050 回答