linux / macOS grep サブディレクトリ テキストファイルの文字列を探す

macOS grep 画面

macOSやLinuxで複数あるテキストファイルの中の特定の文字列を検索する場合、ターミナルアプリのgrepコマンドを使えば簡単に検索が可能です。下のような2つのフォルダ内にそれぞれCSVファイルが入っています。CSVファイルはテキストファイルなのでgrepで検索できます。

複数フォルダにまたがったCSVファイル
複数フォルダにまたがったCSVファイル

grepコマンドで -rのオプションをつけて実行します。grep -r [検索したい文字] [パス]です。

grep -r ワイン ./

上記コマンドを実行すると下のようにフォルダ名含めた結果が表示されます。

grep コマンド実行結果
grep -r コマンド実行結果

より正確に(色付き・行番号などオプション付き)

下記の例は、ログファイル内からIPアドレスを検索しています。

grep -rn --color=auto "52.xx.xx.xxx" .

-n: 該当行の行番号を表示。

--color=auto: 一致部分を色付きで表示。

find と grepを使っても同じような結果が得られます。下記はfind grepコマンドです。

find ./ -type f | xargs grep ワイン  
find [フォルダ名] -type f | xargs grep [検索文字列]
find [フォルダ名] -type f | xargs grep [検索文字列]

拡張子などを限定したい場合(例:.log ファイルのみ)

下記の場合もLOGファイルからIPアドレス検索する例です

find . -type f -name "*.log" -exec grep -Hn --color=auto "52.xxx.xx.xxx" {} +

find.log ファイルだけを対象にし、grep に渡しています。

SwiftUI JSONキーにハイフン(-)が付いている場合の対処 hyphen

hyphen json JSONEncoder

前回、SwiftJSONDecoderを使った処理方法を書きました。今回JSONキーにハイフンが混ざった処理をご紹介します。ハイフン(hyphen)が入った変数を作成することができません。ビルドエラーになってしまいます。しかしWeb上のAPIにはハイフンが混ざったキーもよく見かけます。例えば下記のようなJSONです。

{ "name-1": "Lenina Crowne" }

この場合”name1“なので下記のようにしたいのですがこれではビルドできません。

ビルドエラー
ビルドエラー

JSONキーにハイフンが含まれる場合CodingKeyが含まれたenum宣言を構造体に埋めてキー名の変換を行います。

struct TJson : Codable {
    var name1: String
    enum CodingKeys : String, CodingKey {
        case name1 = "name-1"
    }
}

enumの名称は「CodingKeys」とする必要があるようです。他の名前ではビルドは成功するものの実行するとエラーになりました。

struct TCodingKeyJSONView: View {
    @State var json1 = """
        { "name-1": "Lenina Crowne" }
    """
    var body: some View {
        Text(jsonConvert(json1).name1)
    }
    func jsonConvert(_ s1: String) -> TJson {
        do {
            return try JSONDecoder().decode(TJson.self, from: s1.data(using: .utf8)! )
        } catch {
            return TJson(name1: "")
        }
    }
}

ハイフンキーが入ったJSONの処理ができました。
ハイフンキーが入ったJSONの処理ができました。

JSONEncoderを使ってTJsonからJSON文字列に変換も試してみました。

struct TCodingKeyJSONView: View {
    var body: some View {
        Text(tJsonToJsonStr(TJson(name1: "Bernard Marx")))
    }
    func tJsonToJsonStr(_ j: TJson) -> String{
        let enc = JSONEncoder()
        do {
            let d1 = try enc.encode(j)
            return String(data: d1, encoding: .utf8)!
        } catch {
            return "{}"
        }
    }
}

JSONEncoderもうまく動きました。

ハイフンキー付きJSON作成する場合のJSONEncoder
ハイフンキー付きJSON作成する場合のJSONEncoder
2022 MJELD TECHNOLOGIES. ALL RIGHTS RESERVED