2017-07-28 72 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腳本中過濾掉這些錯誤。