2017-07-28 50 views
-1

我使用tsch创建脚本来更新给定文件夹中库的链接。找出库的最新版本,并去掉库名称

我可以使用(例如)

ldconfig -v | grep libelf 

这给了我

libelf.so.1 -> libelf-0.158.so 
libelf.so.0 -> libelf.so.0.8.13 
libelf.so.1 -> libelf-0.158.so 

,但我不知道怎么剥只是libelf-0.158.so部分得到图书馆最新版本的结果。我试图AKW

set lib = `ldconfig -v | grep libelf | awk '$1 == "-> " {gsub(/\/.*$/, "", $2); print $2}'` 

使用,但没有得到任何结果

我也想插入到这个循环将搜索在给定的文件夹中所有的库链接,因为我不事先知道该文件夹中有哪些库链接,我不希望写的每一个环节的可能性,像

if (-f libelf.so.1) ln -fs /usr/lib64/libelf-0.158.so libelf.so.1 
if (-f libreadline.so.1) ln -fs /lib64/libreadline.so.6.3 libreadline.so.1 
if (-f libXv.so.1) ln -fs /usr/lib64/libXv.so.1.0.0 libXv.so.1 
+0

'awk'$ 2 ==“ - >”{print $ 3}''? – archemiro

+1

'我正在使用tsch,并且正在尝试创建一个脚本 - 不要这么做! [Google“csh why not”](https://www.google.com/search?q=csh+why+not&ie=utf-8&oe=utf-8)。当'libelf.so.1 - > libelf-0.158.so'这样的输入行没有'/'时,你想用'gsub(/\/.*$/,“”,$ 2)做什么? '?为什么在每条输入行都包含这个脚本时,你在awk脚本中测试' - >'? –

回答

2

从您发布所有你需要的是:

ldconfig -v | awk '/libelf/{print $3}' 

请注意,当您已经使用awk时,您从不需要grep(或sed),因为awk可以执行所有可用的操作。

+1

谢谢,它帮了很多! – nc2017

+0

欢迎您访问https://stackoverflow.com/help/someone-answers,了解下一步该做什么。 –

0

问题的第二部分未答复。您可以使用这样的事情:

# ldconfig -p | awk -v dir="." '/libelf/{ \ 
        printf("if (-f %s/%s) ln -fs %s %s/%s\n",\ 
          dir, $1, $4, dir, $1 \ 
        )}' 

这给作为结果:

if (-f ./libelf.so.1) ln -fs /lib64/libelf.so.1 ./libelf.so.1 
if (-f ./libelf.so.1) ln -fs /lib/libelf.so.1 ./libelf.so.1 

一些言论:

  • 可以通过管道awk命令进入到uniq一个电话,但因为你'使用ln -f这没有问题。
  • -v dir=您可以设置您想要创建链接的目录。
  • 我建议使用ldconfig -p,因为-v可能会显示一些错误,您需要在awk脚本中过滤掉这些错误。