6

データベースに挿入するバインド ログをクリーンアップするために、シェル スクリプトの一部として sed を実行しています。

sed コマンドの 1 つを次に示します。

sed -i 's/-/:/g' $DPath/named.query.log

これは、ダッシュも含むリソース要求を中断するため、問題があることが判明しました (さらに下の awk ステートメントの区切り文字として : を使用しています)。

私の質問は、上記の sed コマンドを行の最初の 10 文字だけに制限するにはどうすればよいですか? 私はこれを行う特定のスイッチを見たことがありません.RegExについては、機能するスイッチの開発を開始するのに十分ではありません. パターンがリソース要求の一部である可能性があるため、正規表現を使用して前の数字を照合することはできません。なんてこった、####-##-## にパターン マッチングを使用することさえできません。これも、リソースの一部である可能性があるためです。

どんなアイデアでも大歓迎です。

4

4 に答える 4

2

[ほとんどの場合]awkを使用すると簡単になります。

awk '{target=substr($0,1,10); gsub(/-/,":",target); print target substr($0,11)}' file
于 2012-11-21T19:36:56.617 に答える
2

最短の、そしておそらく最も単純な解決策は、awk[ward] ではなく、sed 自体によって提供されると思います。

 sed "h;s/-/:/g;G;s/\(..........\).*\n........../\1/"

説明:

  • (h) すべてを保留スペースにコピーします
  • (s) 置換を行います (パターン空間全体に対して)
  • (G) ホールド スペースを\n区切り文字で追加する
  • (s) の後の 10 番目までの文字を削除します\nが、最初の 10 番目の文字は保持します。

いくつかのテスト コード:

 echo "--------------------------------" > foo
 sed -i "h;s/-/:/g;G;s/\(..........\).*\n........../\1/" foo
 cat foo
 ::::::::::----------------------
于 2012-11-22T05:54:17.303 に答える
1

sed自体がどのように機能するかはわかりませんが、最初の10文字をsedにフィードしてから、残りを貼り付けることができることはわかっています。

paste -d"\0" <(cut -c1-10 $DPath/named.query.log | sed 's/\-/:/g') <(cut -c11- $DPath/named.query.log)

于 2012-11-21T19:43:20.470 に答える
0

You can do the following:

cut -c 1-10 $DPath/named.query.log | sed -i 's/-/:/g'

The cut statemnt takes only the first 10 chars of each line in that file. The output of that should be piped in a file. As of now it will just output to your terminal

于 2012-11-21T19:35:53.790 に答える