🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

2回答

875閲覧

シェルスクリプトの位置パラメーターの処理とIF文(ksh)

ssk887

総合スコア5

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

1クリップ

投稿2019/10/07 18:25

kshで以下の処理を実現したいです。
初歩的で恐縮ですが、ご回答いただけると幸いです。(ksh)

実現したい事、下記のフォーマットのログで現在の月、日、5:00から翌日5:00までの時間(10/8に実施した場合10/8の5:00から翌日4:59までのデータを抽出したい)に一致した場合は特定の位置パラメーターのみを抽出したい($1(月) $2(日) ($3)時間)

分からないところ

1 ログから$1 $2 $3を抽出する処理
2 月日や時間を判定するif文

ログのフォーマット
Oct 8 10:00 host err xxxxxxxxxxxx ....
Oct 8 11:00 host err xxxxxxxxxxxx ....
.
.
.
Oct 9 4:00 host err xxxxxxxxxxxx ....
Oct 9 5:00 host err xxxxxxxxxxxx ....
Oct 9 6:00 host err xxxxxxxxxxxx ....
Oct 9 7:00 host err xxxxxxxxxxxx ....

実現したい事

10月8日に実施した場合、10月8日5:00~翌4:59までのデータのみを抽出したい
Oct 8 10:00
Oct 8 11:00
Oct 9 4:00

【変数等】
MONTH=mm
DAY=dd
BASETIME=0500
NEXTDAY=dd+1
NEXTMONTH=mm+1

MONTH、DAYは別のスクリプトで実行した日付が入るように定義しております。
NEXTDAY、NEXTMONTHには日付や月が+1されます
例:MONTH=Oct Day=7

iMONTH==$1 && DAY==$2 && $3<BASETIME || NEXTMONTH==$1 NEXTDAY==$2 $3<BASETIME
といった処理ができないか試したのですが、うまくいかず・・・

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

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

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

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

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

nandymak

2019/10/07 23:50

回答ではありませんが、$1~$3を日付として認識すれば抽出しやすそうに思います。 $ echo Oct 9 4:00 host err xxxxxxxxxxxx ....|date "-d `awk '{print $1,$2,$3}'`" "+%Y%m%d%H%M%S" 上記の文で20191009040000が返ります(bashです)。 これ以上思いつきませんでした。
ssk887

2019/10/08 15:45

回答していただきありがとうございます。 参考にさせていただき、なんとか解決できました。
guest

回答2

0

ksh

1MONTH=Oct 2NEXTMONTH=Oct 3DAY=08 4NEXTDAY=09 5BASETIME=0500 6 7while read m d t x 8do if [ "$m-$d" = "$MONTH-${DAY#0}" -a "${t/:/}" -ge "${BASETIME##0}" -o \ 9 "$m-$d" = "$NEXTMONTH-${NEXTDAY#0}" -a "${t/:/}" -lt "${BASETIME##0}" ] 10 then echo $m $d $t 11 fi 12done < inputfile.log

投稿2019/10/08 05:14

otn

総合スコア85893

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

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

ssk887

2019/10/08 15:46

回答していただきありがとうございます。 参考にさせていただきなんとか解決できました。
guest

0

grepとawkじゃダメですかね。
3行になっちゃいますが、こんな感じで。

bash

1#/bin/bash 2exort LANG=C 3grep -P "$(date +'%b %d') (0[5-9]|[12]\d)" logfile | awk '{print $1 $2 $3}' #今日の05時以降 4grep -P "$(date +'%b %d' --date='next day') 0[0-4]" logfile | awk '{print $1 $2 $3}' #明日の04時59分まで

無理やりかけば一行でもできそうだけど。
dateの次の日表現は実装によって方言があるので適当に変更してください。
ところで、10月8日の任意の時点で実行すると、10月9日のログは一行もないと思うんですが。

投稿2019/10/08 00:23

rogueref

総合スコア727

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

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

ssk887

2019/10/08 15:45

回答していただきありがとうございます。 説明が不足しており申し訳ありません。書いていませんでしたが3日前までログが見れるような仕様になっているため、当日5:00から翌日5:00までのログが見れるようにする必要がありました。 参考にさせていただきなんとか解決することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問