投稿

ラベル(Shell)が付いた投稿を表示しています

bashでスラッシュ区切りの日付を簡単に比較する方法

イメージ
お得意のプログラミング言語では、簡単に 日付 比較 するための関数が用意されていますが、 Linux の シェル スクリプト ( bash )となると、 日付 の方は 文字列 なのか 数値 なのか、 if 文 比較 するために使用する 比較演算子 は何かさっぱり分からず詰まってしまったためメモします。 スラッシュ区切りの日付 まずは date を利用して、 日付 の フォーマット を YYYY/MM/DD で 変数 に格納します。 これも書き方がいっぱいあって困りました。 とりあえず代表的なのを2つだけ書いておきます。 # フォーマットは「'」や「"」で囲んでも良し。 TODAY=`date +%Y/%m/%d` # バッククオートの代わりに$()で囲む? TODAY=$(date +%Y/%m/%d) 違いがよくわからないので、詳しい方はコメントください。 前日や翌日の日付を取得する 余談ですが、 date の -d ( —date ) オプション を使って、 1日前 や 1日後 といった 日付 の取得方法もメモしておきます。 # 前日(1日前) YESTERDAY=`date +%Y/%m/%d -d "yesterday"` YESTERDAY=`date +%Y/%m/%d -d "1 day ago"` YESTERDAY=`date +%Y/%m/%d -d "1 days ago"` # 翌日(1日後) TOMORROW=`date +%Y/%m/%d -d "tomorrow"` TOMORROW=`date +%Y/%m/%d -d "1 day"` TOMORROW=`date +%Y/%m/%d -d "1 days"` if文で日付を比較 if 文の書き方がイマイチわからなくて、1番詰まったところです。 端的に言うと、 文字列 と 数値 の 比較演算子 が異なること。 そして、 括弧 の使い方もよくわかっていません。 比較演算子 例えば、AとBが同じかを調べる場合、 文字列 なら「 = 」を使いますが、 数値 なら「 -eq 」となります。 また、 数値 で大小を...

Linuxのuniqコマンドで特定の文字のみ重複する行を抽出

イメージ
例えば、 テキスト ファイル に含まれる レコード の中から 重複 した 行 を削除するには、単純に uniq コマンド を実行するだけで解決するのですが、 特定の文字 が 重複 した行を 抽出 するには、 オプション を付けて sort コマンド とも併用します。 uniqコマンドの基本 uniq コマンド は、単純に全く同じ レコード が 連続 した場合に、 重複 した 行 を 削除 して出力してくれます。 例えば、以下のような データ を含む ファイル があった場合、 111 222 222 333 uniq コマンド を実行すると、 uniq [ファイル名] 出力結果はこのようになります。 111 222 333 uniqコマンドのオプション一覧 uniq コマンド は オプション を付けることによって、 出力形式 や 比較対象 を指定することができます。 オプション(省略) 意味 -c 各行の前に出現回数を出力する -u 重複していない行だけを出力する -d 重複した行だけを出力する -D 重複する行を全て出力する -i 比較時に大文字と小文字の違いを無視する -w N 行の比較を最初のN文字で行う -s N 最初のN文字を比較しない -f N 最初のN個のフィールドを比較しない -z 最後にNULL文字を出力す オプション情報はググったらすぐに見つかりますよ! 本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、「uniq」コマンドです。 【 uniq 】コマンド――重複している行を削除する - @IT 特定の文字を比較して重複行のみ抽出 冒頭でも記述した通り、 uniq コマンド だけでは離れた行にある 重複 したデータを 抽出 できませんし、 オプション を付けないと1行全てを 完全一致 で比較して、 重複 した 行 は 削除 されてしまいます。 そこで、 レコード の 並び替え を行う sort コマンド と、 -w 、 -d オプション を利用して実現します。 sortからのuniq 例えば、内容が以下のような ファイル があったとします。 ...

【Shell】変数内の文字列の末尾から任意の文字を削除する方法

イメージ
シェル で 変数 に格納された文字列を変更しようと思ったら、最初に思いつくのは SubString や 正規表現 などですが、そんな事をしなくても簡単に末尾から任意の文字を削除できる事を最近知ったのでメモっておきます。 ファイル名に日付を追加する 以下の例では、ファイル名の 末尾 、つまりファイル名と 拡張子 の間に現在の日付を追加するサンプルです。 BASE_NAME="Sample.log" FILE_NAME=${BASE_NAME%.*}_`date "+%Y%m%d "`${BASE_NAME#${BASE_NAME%.*}} echo FILE_NAME # 実行結果 # Sample_20201122.log こちらのサイトを参考にさせていただきました。 シェル変数の末尾の文字を削除する シェルスクリプトを書く際、変数の末尾についた余分な記号を取りたいとき、以下のように行っていた(以下、"bananapencilbook"という文字列から"book"を削除する)。OSはCentOS、シェルはbashです。 $ echo ${... シェル変数の末尾の文字を削除する - 何でも屋エンジニアのブログ - 何でも屋エンジニアのブログ 解説 上記の例では、先頭の「 ${BASE_NAME%.*} 」で後ろから検索( 後方一致 )して最初の「.(ドット)」までを除去して出力。 次に、「 _`date "+%Y%m%d " 」で「_(アンダーバー)」と日付を追加。 最後に、「 ${BASE_NAME#${BASE_NAME%.*} 」で拡張子のみを末尾に付加しています。 まとめると、こんな感じ。 ${BASE_NAME%.*} → Sample _`date "+%Y%m%d " → _20201122 ${BASE_NAME#${BASE_NAME%.*} →.log 【結果】 Sample + _20201122 + .log 拡張子 を ワイルドカード で「*(アスタリスク)」にしたのは、どんな 拡張子 が来ても対応できるようにです。 その他にも、 シェル の 変...