2014-03-31 30 views
0

我需要从FTP输出命令解析输出中第100秒后的值。使用AWK从输出解析值

ftp> 8.591220.98disconnect

从堆叠成员协助我一直在使用下列来获取数据:

ut1intput=$(awk 'NR==70{for(i=1;i<=NF;i++)if($i=="ftp>")print $(i+1)} filename.txt) 

我使用sed剥离从输出单词“断开”,但对于如何仅打印100秒的第二个输出感到困惑,即:8.591220.98

awk这个任务的正确工具?

我会很感激任何建议。

+1

你说的'1/100秒output'的是什么意思?你真的需要整个'8.591220.98'令牌,还是只需要最后一个'.'后面的部分?鉴于'8.591220.98'不是一个有效的数字,它究竟代表什么? – mklement0

回答

1

为了解决只是眼前的问题:如果你需要的是从输入数据中提取相同数量的令牌

,你可以简单地使用tr如下:

tr -C -d '0-9.' <<<'ftp> 8.591220.98disconnect' # -> '8.591220.98' 

但它在@更有意义,所需要的操作整合到你原来的awk程序,用sub(),作为哈康Hægland的回答是:

ut1intput=$(awk ' 
    NR==70 { 
    for(i=1;i<=NF;i++) { 
     if($i=="ftp>") { 
     sub(/disconnect$/, "", $(i+1)); # remove 'disconnect' suffix 
     print $(i+1) 
     } 
    } 
    }' filename.txt) 
+1

您不希望在'tr'中使用括号[[它们不是必需的]](http://pubs.opengroup.org/onlinepubs/009696899/utilities/tr.html),并且可能会导致意外的结果,具体取决于在问题的字符串和它的解析。考虑:'tr'.-''12'<<<'._ []?=''=>'1 _ []?='与'tr'[.-]''[12]'<<< '._ []?=''=>'1 _]]]]'。你只想把它们用于角色类。 –

+0

谢谢,@AdrianFrühwirth - 答案更新。 – mklement0

0

awk命令sub(/disconnect/,"", $i)将从字段编号$i中剥离字disconnect。例如:

echo "8.591220.98disconnect" | awk '{sub(/disconnect/,"", $1)}1' 

给出:

8.591220.98