※当サイトの記事には、広告・プロモーションが含まれます。

Windowsでgrep検索っぽいことは、findstrでできるっぽいが、文字コードの対応に難あり...

www.itmedia.co.jp

 全銀によると、中継コンピュータでエラーが発生した直接の原因は、銀行間手数料を入力する際に参照するインデックステーブルが壊れていたこと。一部金融機関のコードが読み取れず、エラーが発生した。

全銀ネット障害、いまだ根本原因特定できず メモリ不足の指摘には「分からない」 - ITmedia NEWS

 一方、一部報道ではメモリ不足や64bit OSへの移行を問題視しているが、小林氏は「現時点でそれがテーブルにどう影響したか分からない」としている。

全銀ネット障害、いまだ根本原因特定できず メモリ不足の指摘には「分からない」 - ITmedia NEWS

⇧ テーブルが壊れてることが分かってるのなら、テーブルを扱っているベンダーのサポートに問い合わせたりできないんかな?

何にせよ、原因が特定できないんなら、改修プログラムを適用する前の状態に切り戻した方が良いような気もするけど、難しいんかな?

稼働50年で初の障害、って言葉が真実だとするならば、加えた改修プログラムが障害のトリガーとなってしまった気がするのだけど...

まぁ、プログラムの改修以外にも何かしら手を加えてるんだとしたら、切り戻し箇所が多くなるとは思うけども、何が影響してるか分からない状態で運用させ続けるのは、精神衛生上、宜しくない気がしますからね...。

切り戻さない状態での運用でも二次的な障害が発生しないってことが担保できていることが分かっているんであれば問題ないとは思うけども...

Windowsgrep検索っぽいことは、findstrでできるっぽいが、文字コードの対応に難あり...

メモ帳しかない使えない環境で、サクラエディタで使えるgrep検索っぽいことをしたかったのだけど、メモ帳しか無いし、はて、どうしたもんか、と思ってググってたら、findstrコマンドなるもので実現できるっぽいですと。

learn.microsoft.com

atmarkit.itmedia.co.jp

さまざまなパターンで文字列を検索するには「正規表現」が使えると便利だ。Windows OSでは、標準装備の「findstr」コマンドが正規表現に対応している。ただし、使い方には注意が必要だ。

Windows OS標準でも「findstr」なら正規表現で検索できます(注意点あり):Tech TIPS - @IT

 UNIXLinux環境に慣れているなら、解決策として「grep」コマンドや「egrep」コマンドが思い浮かぶのではないだろうか。しかし、Windows OSにはgrepは標準装備されていない。

Windows OS標準でも「findstr」なら正規表現で検索できます(注意点あり):Tech TIPS - @IT

 その代わり、「findstr.exe」というコマンドラインコマンドを利用すると、正規表現を使った検索機能が利用できる。

Windows OS標準でも「findstr」なら正規表現で検索できます(注意点あり):Tech TIPS - @IT

Microsoftのドキュメントだと、Windows Serverの学習向けのページで紹介されているコマンドっぽいのだけど、

などでも使えるっぽいですな。自分のマシンがWindows 11へのアップグレードの要件を満たしていないので、Windows 11で試せないから分からんけど、Windows 11とかでも使えるんじゃないかしら。

ただ、

stackoverflow.com

文字コードとかの問題があるっぽい...

Microsoftのfindstrコマンドのドキュメントだと、文字コードの問題については何も言及されていないようなんだが...

公式のドキュメントで、言及ないにもかかわらず、

bestmerge.co.jp

「findstr」の落とし穴

ズバリ、Shift_JISの文字列で検索する」ということです。
つまり、「日本語文字列を検索するのは危ない」

「grep検索」を「findstr」コマンドで代用する時の注意点 | ベストマージ株式会社

ne21.net

特定の文字列を含むファイルを探したいとき、Unix系ではgrepを使うと実現できます。Windowsではコマンドプロンプトから「findstr」「find」が使えましたが、UTF8が利用できませんでした。PowerShellの「Select-String」を使えばUTF8のファイルを検索することができます。

Windowsでフォルダ内の文字列検索をしてファイルに出力する方法 | みずねノート

⇧ 上記サイト様によりますと、原因は特定していらっしゃる...

しかし、残念ながら、いずれも、一次情報が提示されていないので推測の域を出ていないと思われるわけなのだが...

とりあえず、日本語とかも扱いたいってなった場合に、findstrは使い物にならないらしいので、

cfautog.tokyo

⇧ 上記サイト様にありますように、Windows環境では、PowerShellのコマンドである、「Select-String」を使った方が良さ気でありそう。

findstrコマンドを試してみる

実際、findstrが使い物にならないのか確認してみる。

というわけで、まずは、適当にファイルを用意しておく。

⇧ 公開されているOutOfMemoryについての内容をコピペしてます。『OutOfMemoryError例外の理解』って文言は、Java 8とJava 11までのドキュメントには載ってるけど、Java 17 からは『java.lang.OutOfMemoryErrorエラー』って文言に痴れっと変わってるっぽい...

脱線しましたが、findstrコマンドを実行してみる。

findstr /S /n /C:"OutOfMemoryError" *.* > grep_result.txt

で、

サクラエディタで開くと、壮絶な文字化け...

メモ帳で開いても、文字化けしとりますな...ただ、1行分が変に改行された見た目になっていないのが多少はましか...

Javaの標準APIとかライブラリとかで出力されるエラーはほとんど英語だと思うから、エラー・ログとかでgrep検索するには問題ないかも知らんけど、日本語のエラーメッセージとかを検索したいってなった場合は、findstrコマンドは全く役に立たないってことですな...

PowerShellのコマンドである、Select-Stringを試してみる

findstrコマンドは、日本語に対しては無力であると。

というわけで、

learn.microsoft.com

tex2e.github.io

⇧ 上記サイト様を参考にPowerShellのコマンドである「Select-String」を試してみます。

Get-ChildItem -Recurse | Select-String -Pattern "OutOfMemoryError" > grep_result_by_select-string.txt

⇧ 出力結果のファイルを確認してみる。

■メモ帳で開いた場合

サクラエディタで開いた場合

⇧ う~む、ファイルのパスが文字化けしてるっぽい...

何やら、

blog.powershell-from.jp

PowerShell独特のファイル出力方法がある模様。

■UTF8

Get-ChildItem -Recurse | Select-String -Pattern "OutOfMemoryError" | Out-File -FilePath "C:\Users\Toshinobu\Desktop\soft_work\winodws_work\grep_result_by_select-string_utf8.txt" -Encoding UTF8

⇧ UTF8指定しても駄目なんだが...

akrad.hatenablog.com

⇧ 上記サイト様を参考に、他の文字コードについても試してみる。

■Default

Get-ChildItem -Recurse | Select-String -Pattern "OutOfMemoryError" | Out-File -FilePath "C:\Users\Toshinobu\Desktop\soft_work\winodws_work\grep_result_by_select-string_default.txt" -Encoding Default

■ASCII

Get-ChildItem -Recurse | Select-String -Pattern "OutOfMemoryError" | Out-File -FilePath "C:\Users\Toshinobu\Desktop\soft_work\winodws_work\grep_result_by_select-string_ASCII.txt" -Encoding ASCII

Unicode

Get-ChildItem -Recurse | Select-String -Pattern "OutOfMemoryError" | Out-File -FilePath "C:\Users\Toshinobu\Desktop\soft_work\winodws_work\grep_result_by_select-string_Unicode.txt" -Encoding Unicode

Oem

Get-ChildItem -Recurse | Select-String -Pattern "OutOfMemoryError" | Out-File -FilePath "C:\Users\Toshinobu\Desktop\soft_work\winodws_work\grep_result_by_select-string_Oem.txt" -Encoding Oem

⇧ う~む、ファイルパスの文字化けには対応しとらんのかしら?

相変わらず、Windowsのコマンドって微妙だなぁ...

Microsoftの我関せず感、何とかならんものか...

あんたらが提供してるコマンドだろうに...

毎度モヤモヤ感が半端ない...

今回はこのへんで。