Awk 找出库的最新版本,只去掉库名

Awk 找出库的最新版本,只去掉库名,awk,Awk,我正在使用tsch创建一个脚本,用于更新给定文件夹中库的链接 我可以使用(例如)获取库的最新版本 这让我 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 == "-&

我正在使用tsch创建一个脚本,用于更新给定文件夹中库的链接

我可以使用(例如)获取库的最新版本

这让我

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

根据您发布的内容,您需要的是:

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

请注意,当您已经在使用awk时,您永远不需要grep(或sed),因为awk可以做任何有用的事情。

问题的第二部分没有答案。您可以使用以下内容:

# 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脚本中过滤掉这些错误

awk'$2==“->”{print$3}'
我正在使用tsch,我正在尝试创建脚本
-不要这样做。当像
libelf.so.1->libelf-0.158.so这样的任何输入行中都没有
/
时,您想用
gsub(/\/.*$/,“”,$2)
做什么?为什么要在awk脚本中测试
->
,而每个输入行都包含该脚本?不客气,请参阅下一步的操作。
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