2013-11-27 9 views
5

のsed:私はawkでのスクリプトを作成したいと思いますソート行がアルファベット順のawkを使用して、および/または私はそうのようにフォーマット数百行を持つファイル持って

#blah 
RewriteCond %{HTTP_HOST} www.blah.com [NC] 
RewriteRule ^/xyz(|/)$ http://www.blah.com/404.html [R=301,L,NC] 

#xblah 
RewriteCond %{HTTP_HOST} www.blah.com [NC] 
RewriteRule ^/hkf(|/)$ http://www.blah.com/404.html [R=301,L,NC] 

#ablah 
RewriteCond %{HTTP_HOST} www.blah.com [NC] 
RewriteRule ^/abc/.*(|/)$ http://www.blah.com/404.html [R=301,L,NC] 

を/使用してこのファイルをアルファベット順にするのsed各テキストグループの3行目の2番目の引数。このファイルの場合は、 "abc"、 "hkf"または "xyz"です。これは、このApacheリダイレクトファイルで作成されたリダイレクトです。

  1. CONCATENATEソート-k3,3
  2. を使用して、各ライン間の区切り文字
  3. ソートして1行に3行の各グループのライン:

    は私がやりたいことだったことを考え出しその後、3ラインを組み立て直すことでしょう

マイ期待される出力をファイルに分ける空白行

  • 書き込みを構築します次のようになります。

    #ablah 
    RewriteCond %{HTTP_HOST} www.blah.com [NC] 
    RewriteRule ^/abc/.*(|/)$ http://www.blah.com/404.html [R=301,L,NC] 
    
    #xblah 
    RewriteCond %{HTTP_HOST} www.blah.com [NC] 
    RewriteRule ^/hkf(|/)$ http://www.blah.com/404.html [R=301,L,NC] 
    
    #blah 
    RewriteCond %{HTTP_HOST} www.blah.com [NC] 
    RewriteRule ^/xyz(|/)$ http://www.blah.com/404.html [R=301,L,NC] 
    

    これは意味がありますか?これを行うより良い方法はありますか?

    p.s.私の意図は、スクリプトを移植可能にして、この構造のいくつかのファイルで使用できるようにすることです。問題を解決するためのコードを提案するときは、この問題を効率的に解決する方法を理解し始め、最終結果を拡張できるようにするために、私のようなnewbのランク付けを可能な限り最善の方法で説明してください。

    ご協力ありがとうございます。

  • +2

    を入力の上からの出力ファイルを期待されていますか? – anubhava

    +0

    anubhava、私は私のOPを編集した、私はそれが今より意味があると思う。 – user3043123

    +0

    sedはソートに適していないので、awkはあなたのツールになります – NeronLeVelu

    答えて

    1

    あなたのアイデアは、十分に簡単な方法論のようでした。これはあなたのテストデータで私にとってはうまくいくようです。それは余分な空白行を追加します、そして、私はそれを並べ替えるために今のところ十分に集中していません。/^#/と/^$ /印刷との間のすべての行の行については

    awk '/^#/,/^$/ {printf "%s\0",$0} /^$/ {print ""} END {print ""}' 20250937.input | sort -t'\0' -k3,3 | tr '\0' '\n' 
    
    1. アウト代わりに改行ターミネータのヌルを持ちます。
    2. 空白行が表示されたときに改行も出力されます。
    3. 出力が改行で終わっていることを確認してください。
    4. 私たちのフィールドに並べ替えます。
    5. ヌルを改行に変換し直します。
    +0

    私はawkコマンドを編集して3行の代わりに2行を扱うことができましたが、同じファイル内の2行と3行を扱えるように上記のコマンドをどのように修正できるのでしょうか? – user3043123

    +0

    awkは、コメントとブロックの終わりの間の線の量について何も知らない。カウントを気にする部分だけがソートです。あなたはどこかでソートするものと、ソート対象が動いている(または悪いと、ブロック間で一貫していない)ものを定義することができなければなりません。 –

    1

    いくつかのsedのバージョン:

    sed -n '/^#/{N;h;n;H;x;s/\n/XnlX/g;x;s!.*\^/\([a-z]*\).*!\1!;G;s/\n/ /;p}' input \ 
         | sort | sed 's/[^ ]* //;s/$/\n/;s/XnlX/\n/g' 
    

    が生成されます

    #ablah 
    RewriteCond %{HTTP_HOST} www.blah.com [NC] 
    RewriteRule ^/abc/.*(|/)$ http://www.blah.com/404.html [R=301,L,NC] 
    
    #xblah 
    RewriteCond %{HTTP_HOST} www.blah.com [NC] 
    RewriteRule ^/hkf(|/)$ http://www.blah.com/404.html [R=301,L,NC] 
    
    #blah 
    RewriteCond %{HTTP_HOST} www.blah.com [NC] 
    RewriteRule ^/xyz(|/)$ http://www.blah.com/404.html [R=301,L,NC] 
    
    5

    あなたは、GNU awkでの全体の動作を行うことができます。

    sort.awkはです
    awk -f sort.awk input.txt 
    
    BEGIN { 
        RS="" 
    } 
    { 
        match($0,/RewriteRule \^\/(.*)\(\|/,a) 
        key[NR]=a[1] "\t" NR 
        block[NR]=$0 
    } 
    
    END { 
        asort(key) 
        for (i=1; i<=NR; i++) { 
         split(key[i],a,"\t") 
         print block[a[2]] 
         printf "\n" 
        } 
    } 
    

    が生成されます

    #ablah 
    RewriteCond %{HTTP_HOST} www.blah.com [NC] 
    RewriteRule ^/abc/.*(|/)$ http://www.blah.com/404.html [R=301,L,NC] 
    
    #xblah 
    RewriteCond %{HTTP_HOST} www.blah.com [NC] 
    RewriteRule ^/hkf(|/)$ http://www.blah.com/404.html [R=301,L,NC] 
    
    #blah 
    RewriteCond %{HTTP_HOST} www.blah.com [NC] 
    RewriteRule ^/xyz(|/)$ http://www.blah.com/404.html [R=301,L,NC] 
    
    +2

    このawkスクリプトはかなり弾丸の証拠で、いくつかの点でそれを打破しようとしました。解決していただきありがとうございます。論理を理解するためには、しばらくの間、頭を打つ必要があります。ありがとうございました。 – user3043123

    関連する問題