1

D-LinkルーターからVoipログを抽出する必要があるため、telnet経由でこのルーターでコマンドを実行する小さなPythonスクリプトを設定しました。私のスクリプトは「cat/var/log/calls.log」を実行して結果を返しますが、BusyBoxバナーなどの重要でないものも送信します...1から6までの行を無視するにはどうすればよいですか?そして最後の2つ?これは私の現在の出力です:

yaba@foobar:/stuff$ python calls.py


BusyBox v1.00 (2009.04.09-11:17+0000) Built-in shell (msh)
Enter 'help' for a list of built-in commands.

DVA-G3170i/PT # cat /var/call.log
1         ,1294620563,2  ,+351xxx080806  ,xxx530802      ,1  ,3  ,1
DVA-G3170i/PT # exit

そして私はただ必要です:

1         ,1294620563,2  ,+351xxx080806  ,xxx530802      ,1  ,3  ,1

(複数行にすることができます)CSVに保存し、後でSQLデータベースに保存できるようにします。

ありがとう、そして私の悪い英語をごめんなさい。

4

5 に答える 5

3

AWKでパターンを使用して、必要なテキストに一致させてみませんか?

python calls.py | awk '/^[0-9]/{print}/'

AWKのポイント全体は、パターンに基づいて線を一致させ、それらの一致した線を操作/印刷することです。


実行例を追加するために編集されました。

上記のサンプルに基づくジャンクデータファイルを次に示します。

$ cat junk.dat


BusyBox v1.00 (2009.04.09-11:17+0000) Built-in shell (msh)
Enter 'help' for a list of built-in commands.

DVA-G3170i/PT # cat /var/call.log
1         ,1294620563,2  ,+351xxx080806  ,xxx530802      ,1  ,3  ,1
DVA-G3170i/PT # exit

これは、フィルターを使用してAWKで実行しています。

$ cat junk.dat | awk '/^[0-9]/ {print}'
1         ,1294620563,2  ,+351xxx080806  ,xxx530802      ,1  ,3  ,1

SED、カウントライン、AWK以外は必要ありません。なぜ物事を必要以上に複雑にするのですか?

于 2011-01-10T02:34:40.500 に答える
1

1回の呼び出しでsed

sed -n '1,6d;7,${N;$q;P;D}'

またはのうるさいバージョンの場合sed

sed -ne '1,6d' -e '7,${N' -e '$q' -e 'P' -e 'D}'

一致に基づいてそれを行うこともできます:

sed -n '/^[0-9]+/p'

または同様のもの。

しかし、Pythonスクリプトが(外部ユーティリティを呼び出す代わりに)ファイルを読み取ってフィルタリングを行わないのはなぜですか?

于 2011-01-10T02:35:36.637 に答える
0

Pythoncalls.py | sed -e 1,6d -e'$ d'


だからそれはうまくいくかもしれません。最初の6つと最後の6つを除外します。これは、例で必要なことを示しています。最後の2行を本当に壊したい場合は、次のようにすることができます。

python calls.py | sed -e 1,6d -e '$d' | sed -e '$d'

しかし、待ってください...あなたはawkと言ったので...

python calls.py | awk '{ if(NR > 7) { print t }; t = $0 }'
于 2011-01-10T01:36:10.433 に答える
0

これはあなたのために働くかもしれません:

sed '1,6d;$!N;$d;P;D' file
于 2012-03-15T18:36:20.417 に答える
-1

これが最善の方法かどうかはわかりませんが(おそらくD-LinkルーターはFTPまたはSSHをサポートしています)、awkを使用して実行できます。

awk '/cat/, /exit/' | sed -e '1d' -e '$d'

awkは、「cat」と「exit」を含む行の間のすべてを出力しますが、残念ながらこれらの2行は含まれます。それが残りのコマンドの目的です、私はそれよりもうまくそれを行う方法を理解できませんでした...

于 2011-01-10T01:47:53.590 に答える