考虑我的可执行文件的这个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
也不起作用......
答案 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