我有一个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 可以在 - >之后打印文字.., 请告诉我!非常感谢!
维蒂娅
答案 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 $]