2013-12-11 29 views
0

我有一個UNIX腳本,我需要以下符號鏈接如何用awk後提取的第一個字 - >字符

例如提取循環次數:

位置/ TEST1 /測試2/TEST3/TEST4點../c2.3/output/test5/test6_Suite

so ls -l /test1/test2/test3/test4 -> ../c2.3/output/test5/test6_Suite 

我需要提取C2.3。我嘗試使用awk -F /'{print $ 5}'。它只有在c2.3位於第5位時纔有效。如果位置改變,我們如何編寫腳本來打印?

例如ls -l/test1/test2/test3/test4/test5 - > ../c2.3/output/test5/test6_Suite 可以在awk後打印文本 - > ..請讓我知道!非常感謝!

維迪亞

回答

3

解析ls -l是你不需要的併發症。試試這個:

readlink /test1/test2/test3/test4/test5 | awk -F/ '{print $2}' 
+0

一流的,這工作。非常感謝!! – user3060455

2

Amadan是正確的,解析不建議ls,我不碰這個問題的一部分。我明白,我們的目標是提取c2.3,無論它出現在輸入字符串中。所以,我創建了一些測試輸入,對給定的主題有一些變化:

[cycle_number $] cat test.in 
../c2.3/output/test5/test6_Suite 
../output/test5/test6_Suite/c2.4/ 
../output/c2.5/test5/test6_Suite 
../output/test5/c6.8/test6_Suite 
../output/test5/c6.81/test6_Suite 
../output/test5/c136.8/test6_Suite 
../output/test5/c36.809/test6_Suite 

../a2.3/output/test5/test6_Suite 
../output/test5/test6_Suite/b2.4/ 
../output/c2.5/test5/test6_Suite 
../output/test5/d6.8/test6_Suite 
../output/test5/e6.81/test6_Suite 
../output/test5/f136.8/test6_Suite 
../output/test5/g36.809/test6_Suite 

../ab2.3/output/test5/test6_Suite 
../output/test5/test6_Suite/abc2.4/ 
../output/abcd2.5/test5/test6_Suite 
../output/test5/d6.8/test6_Suite 
../output/test5/e6.81/test6_Suite 
../output/test5/f136.8/test6_Suite 
../output/test5/g36.809/test6_Suite 


[cycle_number $] 

下面的sed腳本提取次數和在該行的起始地址打印:

[cycle_number $] sed 's|^.*\/\([a-zA-Z]\+[0-9]\+\.[0-9]\+\)\/.*$|\1 &|' test.in 
c2.3 ../c2.3/output/test5/test6_Suite 
c2.4 ../output/test5/test6_Suite/c2.4/ 
c2.5 ../output/c2.5/test5/test6_Suite 
c6.8 ../output/test5/c6.8/test6_Suite 
c6.81 ../output/test5/c6.81/test6_Suite 
c136.8 ../output/test5/c136.8/test6_Suite 
c36.809 ../output/test5/c36.809/test6_Suite 

a2.3 ../a2.3/output/test5/test6_Suite 
b2.4 ../output/test5/test6_Suite/b2.4/ 
c2.5 ../output/c2.5/test5/test6_Suite 
d6.8 ../output/test5/d6.8/test6_Suite 
e6.81 ../output/test5/e6.81/test6_Suite 
f136.8 ../output/test5/f136.8/test6_Suite 
g36.809 ../output/test5/g36.809/test6_Suite 

ab2.3 ../ab2.3/output/test5/test6_Suite 
abc2.4 ../output/test5/test6_Suite/abc2.4/ 
abcd2.5 ../output/abcd2.5/test5/test6_Suite 
d6.8 ../output/test5/d6.8/test6_Suite 
e6.81 ../output/test5/e6.81/test6_Suite 
f136.8 ../output/test5/f136.8/test6_Suite 
g36.809 ../output/test5/g36.809/test6_Suite 



[cycle_number $] 

顯然,你如果你不想要原始行,可以刪除最後的&。如果這不是你想要的,歡迎發佈更多細節。

+0

謝謝你,sed works也一樣。我嘗試了這種路徑中具有符號鏈接的不同組合,效果很好。 – user3060455

1

這裏是徒勞無功的解決方案:

[cycle_number $] cat test.in 
../c2.3/output/test5/test6_Suite   
../output/test5/test6_Suite/c2.4/   
../output/c2.5/test5/test6_Suite   
../output/test5/c6.8/test6_Suite   
../output/test5/c6.81/test6_Suite   
../output/test5/c136.8/test6_Suite   
../output/test5/c36.809/test6_Suite  

../a2.3/output/test5/test6_Suite 
../output/test5/test6_Suite/b2.4/ 
../output/c2.5/test5/test6_Suite 
../output/test5/d6.8/test6_Suite 
../output/test5/e6.81/test6_Suite 
../output/test5/f136.8/test6_Suite 
../output/test5/g36.809/test6_Suite 

../ab2.3/output/test5/test6_Suite 
../output/test5/test6_Suite/abc2.4/ 
../output/abcd2.5/test5/test6_Suite 
../output/test5/d6.8/test6_Suite 
../output/test5/e6.81/test6_Suite 
../output/test5/f136.8/test6_Suite 
../output/test5/g36.809/test6_Suite 



[cycle_number $] cat cn.awk 
#!/usr/bin/awk -f 

BEGIN{ 
    FS="/" 
} 

{ 
    for(i=1; i<=NF; i++){ 

     if(match($i, /[a-z]+[0-9]+\.[0-9]+/)){ 
      print $i 
     } 
    } 

} 
[cycle_number $] ./cn.awk test.in 
c2.3 
c2.4 
c2.5 
c6.8 
c6.81 
c136.8 
c36.809 
a2.3 
b2.4 
c2.5 
d6.8 
e6.81 
f136.8 
g36.809 
ab2.3 
abc2.4 
abcd2.5 
d6.8 
e6.81 
f136.8 
g36.809 
[cycle_number $] 
相關問題