質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

Q&A

解決済

3回答

1602閲覧

sedコマンドでテキスト削除

退会済みユーザー

退会済みユーザー

総合スコア0

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

0グッド

0クリップ

投稿2017/04/10 11:39

Apacheのログファイルからエラーログを抽出して本日以外の行を削除しようとしています。
でも、どうすれば良いのか分からず前日でも消えればと思い試行錯誤していました。
[09/Apr/2017:05:43:41 +0900]
上記のようなログの日付部分だけで判断すれば良いと考え

LANG=C day=`date +'%d/%h/%Y' --date "1 days ago"` grep " 404 " access_log > error_log.txt sed -i -e "/$day/d" error_log.txt

上記のようにしました所、エラーをerror_log.txtに抜き出すのはできるのですが
最後の削除でエラーが出てしまいます。
デバッグしましたら

+ LANG=C ++ date +%d/%h/%Y --date '1 days ago' + day=09/Apr/2017 + grep ' 404 ' access_log + sed -i -e /09/Apr/2017/d error_log.txt sed: -e expression #1, char 5: unknown command: `A'

このように表示されます。
どのようにすれば考えていることを実現できますでしょうか。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

/09/Apr/2017/dのように、スラッシュ区切りの正規表現中に、テキストとして取るべきスラッシュが混入しているためにエラーとなっています。

区切り文字は別のものに変えられるので、\@$day@とすればいい…のですが、dコマンドは削除なので、やりたいことと正反対の動作になってしまいます。

sed -i -n -e "\\@$day@p" error_log.txtのように、-nで全行出力を止めて、pで目的の箇所だけ出力しましょう。

投稿2017/04/10 12:02

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/04/10 12:21

ご回答ありがとうございます。 -nで止めてpで出力… 何か難しいですね。と言うか自分が知識無さすぎですね(;^_^A 試してみましたら本日分の行が全て消えました… 何故でしょうか…
maisumakun

2017/04/10 12:24

dateコマンドで「1 days ago」にしていたのを見落としていました、すみません(「昨日だけ残る」ことになります)。 day=`date +'%d/%h/%Y'`とすれば今日の値が取れるので、そちらも書き換えてください。
退会済みユーザー

退会済みユーザー

2017/04/10 12:32

ご回答ありがとうございます。 なるほど、いけました! 希望通り今日だけ残りました。 ありがとうございます。 今日以外を消すじゃなくて今日だけ残すって事なんですね。 発想の転換と言うか考え方だけですね(;^_^A どちらにしても自分の力だけでは絶対に実現できませんでした。 この度はありがとうございました。
guest

0

Bash

1LANG=C 2day=`date +'%d/%h/%Y'` 3 4grep "$day.* 404 " access_log > error_log.txt

でいいのでは?

投稿2017/04/10 12:47

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/04/10 13:49 編集

ご回答ありがとうございます。 すごいシンプルですね! sedじゃないといけないと勝手に決め込んでいましたが grepで抜き出して書き出すと云う方法もあるんですね。 勉強になりました。 もっとしっかり学習します(;^_^A ありがとうございます。
guest

0

  • sed -i -e /09/Apr/2017/d error_log.txt

スラッシュ多すぎですよね。エスケープしときましょう。

day=`date +'%d\/%h\/%Y' --date "1 days ago"`

投稿2017/04/10 12:06

nullbot

総合スコア910

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/04/10 12:25 編集

ご回答ありがとうございます。 お教え頂いた通りに変更しましたら希望通りになりました。 贅沢を言えば本日以外すべて削除したいのですが、簡単にできるのでしょうか? 自分の知識ではday=`date +'%d\/%h\/%Y' --date "1 days ago"`の数値を増やして並べる位しか思いつきませんが…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問