grepを読む(その8)

実はもっと簡単なgrep指定がありました。こちらを使います。

takk@deb9:~/tmp/grep-3.1/src$ grep -A1 "^......case.*'.'" grep.c
      case 'A':
        context_length_arg (optarg, &out_after);
--
      case 'B':
        context_length_arg (optarg, &out_before);
--

省略

--
      case 'Z':
        filename_mask = 0;
--
      case 'z':
        eolbyte = '\0';
takk@deb9:~/tmp/grep-3.1/src$

並び替えると見やすくなります。

takk@deb9:~/tmp/grep-3.1/src$ grep -A1 "^......case.*'.'" grep.c | tr -d '\n' | perl -pe 's/\bcase/\ncase/g'

case 'A':        context_length_arg (optarg, &out_after);--
case 'B':        context_length_arg (optarg, &out_before);--
case 'C':        /* Set output match context, but let any explicit leading or-- 
case 'D':        if (STREQ (optarg, "read"))--
case 'E':        matcher = setmatcher ("egrep", matcher);--
case 'F':        matcher = setmatcher ("fgrep", matcher);--
case 'P':        matcher = setmatcher ("perl", matcher);--
case 'G':        matcher = setmatcher ("grep", matcher);--
case 'X': /* undocumented on purpose */        matcher = setmatcher (optarg, matcher);--
case 'H':        with_filenames = true;--
case 'I':        binary_files = WITHOUT_MATCH_BINARY_FILES;--
case 'T':        align_tabs = true;--
case 'U':        if (O_BINARY)--
case 'u':        /* Obsolete option; it has no effect.  FIXME: Diagnose use of--
case 'V':        show_version = true;--
case 'a':        binary_files = TEXT_BINARY_FILES;--
case 'b':        out_byte = true;--
case 'c':        count_matches = true;--
case 'd':        directories = XARGMATCH ("--directories", optarg,--
case 'e':        cc = strlen (optarg);--
case 'f':        if (STREQ (optarg, "-"))--
case 'h':        with_filenames = false;--
case 'i':
case 'y':                       /* For old-timers . . . */        match_icase = true;--
case 'L':        /* Like -l, except list files that don't contain matches.--    
case 'l':        list_files = LISTFILES_MATCHING;--
case 'm':        switch (xstrtoimax (optarg, 0, 10, &max_count, ""))--
case 'n':        out_line = true;--
case 'o':        only_matching = true;--
case 'q':        exit_on_match = true;--
case 'R':        fts_options = basic_fts_options | FTS_LOGICAL;--
case 'r':        directories = RECURSE_DIRECTORIES;--
case 's':        suppress_errors = true;--
case 'v':        out_invert = true;--
case 'w':        wordinit ();--
case 'x':        match_lines = true;--
case 'Z':        filename_mask = 0;--
case 'z':        eolbyte = '\0';takk@deb9:~/tmp/grep-3.1/src$

各オプションとフラグの関係がすぐに分かるようになりました。
一つピックアップして、manと見比べます。

takk@deb9:~/tmp/grep-3.1/src$ !! | shuf | head -1
grep -A1 "^......case.*'.'" grep.c | tr -d '\n' | perl -pe 's/case/\ncase/g' | shuf | head -1
case 'c':        count_matches = true;--
takk@deb9:~/tmp/grep-3.1/src$

man grepの -cの説明はこのようになっています。

       -c, --count
              通常の出力はせず、各入力ファイルについてマッチした行数を表示しま
              す。 -v, --invert-match オプション (上記参照) と共に指定した場合
              は、  マッチしなかった行数を表示します。  (-c オプションは POSIX
              で指定されています)

-cオプションのフラグは、count_matchesです。それはそれで分かりやすいのですが、ロングオプションの–countの名前を合わせても良かったのでは? と思ってしまいました。

つづく