実はもっと簡単な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の名前を合わせても良かったのでは? と思ってしまいました。
つづく


コメント