-3

バイナリ ファイルから入力データを取得し、出力ファイルに書き込むコマンドを見つけました。

nawk 'c-->0;$0~s{if(b)for(c=b+1;c>1;c--)print r[(NR-c+1)%b];print;c=a}b{r[NR%b]=$0}' b=1 a=19 s="<Comment>Ericsson_OCS_V1_0.0.0.7" /var/opt/fds/config/ServiceConfig/ServiceConfig.cfg > /opt/temp/"$circle"_"$sdpid"_RG.cfg

それは機能していますが、方法を見つけることができません...上記のコマンドがどのように機能し、何をしているのかを誰か助けてもらえますか?...このnawkは理解するのが難しすぎます...:(事前に感謝します。 .....

4

1 に答える 1

0

nawk は理解するのが難しくなく、他の言語と同じです。適切にフォーマットされていないため、理解できないと思います。フォーマットすると、どのように機能するかがわかります。

あなたの質問に答えるために、このコマンドは、指定された入力ファイル内の入力テキストを含む行を検索し、一致した行の前に数行、一致した行の後に数行を出力します。印刷する行数は変数"b" (前の行数) と"a" (後の行数) によって制御され、検索する文字列/テキストは変数"s"を使用して渡されます。

このコマンドは、大きなサイズのログ ファイル (UNIX/LINUX の vi またはその他のエディターで開くのが難しい) から行を抽出したい場合のデバッグ/トラブルシューティングに役立ちます。 .

だからあなたのコマンドで

b=1   ## means print only 1 line before the matching line
a=19  ## means print 19 lines after the matching line
s="<Comment>Ericsson_OCS_V1_0.0.0.7" ## means search for this string
/var/opt/fds/config/ServiceConfig/ServiceConfig.cfg ## search in this file
/opt/temp/"$circle"_"$sdpid"_RG.cfg ## store the output in this file

フォーマットされたコマンドは以下のとおりです。フォーマットが解釈される前に c-->0 のように見えた最初の条件は、c-- 0 より大きいことを意味します。AWK の NR 変数は、入力ファイルで現在処理中の行の行番号を示します。処理されます。

nawk '
 c-- > 0; 
 $0 ~ s
 {
  if(b)
    for(c=b+1;c>1;c--)
      print r[(NR-c+1)%b];
    print;
    c=a
 }
 b 
 {  
   r[NR%b]=$0  
 }' b=1 a=19 s="<Comment>Ericsson_OCS_V1_0.0.0.7" /var/opt/fds/config/ServiceConfig/ServiceConfig.cfg > /opt/temp/"$circle"_"$sdpid"_RG.cfg
于 2014-07-29T13:49:58.167 に答える