如何使用awk提取后的第一个单词 - >字符

时间:2013-12-11 01:12:22

标签: shell

我有一个unix脚本,我需要在符号链接后提取循环数

例如:

位置/ test1 / test2 / 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 可以在 - >之后打印文字.., 请告诉我!非常感谢!

维蒂娅

3 个答案:

答案 0 :(得分:3)

解析ls -l是您不需要的并发症。试试这个:

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

答案 1 :(得分: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 $]

显然,如果您不想要原始行,则可以删除最后一个&。如果这不是您想要的,请随时发布更多详细信息。

答案 2 :(得分: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 $]