/usr/share/man/man1のマンページからすべてのコマンドの要約を正しく抽出するにはどうすればよいですか?

/usr/share/man/man1のマンページからすべてのコマンドの要約を正しく抽出するにはどうすればよいですか?

すべて抽出しようとしています。コマンドの要約/usr/share/man/man1マニュアルページから:

#!/usr/bin/env bash
## synopses - extract all synopses in /usr/share/man/man1

cd /usr/share/man/man1
for i in *.gz; do
    echo "$i:" | sed -E "s/.1.gz|.gz//g"
    man "./$i" | sed -n '/^SYNOPSIS/,/^[A-Z][A-Z][A-Z]/p' | sed -e '1d; $d' | tr -s [:space:]
done

...これは以下を提供します一部成功の尺度 - コマンドの出力全体を次のように取得します。到着。しかし、私はまた多くのエラーを経験しました。標準エラーfor i in ./*.gz; do man "$i"そしてfor i in *.gz; do man "./$i"ファイルに出力するとき( synopses > file) 1 :

<standard input>:27: expected `;' after scale-indicator (got `o')
<standard input>:29: expected `;' after scale-indicator (got `o')
<standard input>:283: name expected (got `\{'): treated as missing
<standard input>:674: warning: macro `as',' not defined (possibly missing space after `as')
<standard input>:174: name expected (got `\{'): treated as missing
<standard input>:161: warning [p 1, 5.5i]: can't break line
<standard input>:594: warning [p 5, 3.8i, div `an-div', 0.0i]: can't break line
<standard input>:569: warning [p 6, 0.0i]: can't break line
<standard input>:147: warning [p 1, 1.8i]: can't break line
<standard input>:205: warning [p 2, 0.2i]: can't break line
<standard input>:525: warning [p 5, 4.5i]: can't break line
<standard input>:157: warning [p 1, 4.8i]: can't break line
<standard input>:351: warning [p 3, 1.8i, div `an-div', 0.0i]: can't break line
<standard input>:147: a space character is not allowed in an escape name
man: can't open man1/zshmisc.1: No such file or directory
man: -:423: warning: failed .so request
man: can't open man1/zshexpn.1: No such file or directory
man: -:423: warning: failed .so request
man: can't open man1/zshparam.1: No such file or directory
man: -:423: warning: failed .so request
man: can't open man1/zshoptions.1: No such file or directory
man: -:423: warning: failed .so request
man: can't open man1/zshbuiltins.1: No such file or directory
man: -:423: warning: failed .so request
man: can't open man1/zshzle.1: No such file or directory
man: -:423: warning: failed .so request
man: can't open man1/zshcompwid.1: No such file or directory
man: -:423: warning: failed .so request
man: can't open man1/zshcompsys.1: No such file or directory
man: -:423: warning: failed .so request
man: can't open man1/zshcompctl.1: No such file or directory
man: -:423: warning: failed .so request
man: can't open man1/zshmodules.1: No such file or directory
man: -:423: warning: failed .so request
man: can't open man1/zshcalsys.1: No such file or directory
man: -:423: warning: failed .so request
man: can't open man1/zshtcpsys.1: No such file or directory
man: -:423: warning: failed .so request
man: can't open man1/zshzftpsys.1: No such file or directory
man: -:423: warning: failed .so request
man: can't open man1/zshcontrib.1: No such file or directory
man: -:423: warning: failed .so request
<standard input>:423: can't open `man1/zshmisc.1': No such file or directory
<standard input>:424: can't open `man1/zshexpn.1': No such file or directory
<standard input>:425: can't open `man1/zshparam.1': No such file or directory
<standard input>:426: can't open `man1/zshoptions.1': No such file or directory
<standard input>:427: can't open `man1/zshbuiltins.1': No such file or directory
<standard input>:428: can't open `man1/zshzle.1': No such file or directory
<standard input>:429: can't open `man1/zshcompwid.1': No such file or directory
<standard input>:430: can't open `man1/zshcompsys.1': No such file or directory
<standard input>:431: can't open `man1/zshcompctl.1': No such file or directory
<standard input>:432: can't open `man1/zshmodules.1': No such file or directory
<standard input>:433: can't open `man1/zshcalsys.1': No such file or directory
<standard input>:434: can't open `man1/zshtcpsys.1': No such file or directory
<standard input>:435: can't open `man1/zshzftpsys.1': No such file or directory
<standard input>:436: can't open `man1/zshcontrib.1': No such file or directory

これらの<standard input>エラー(エスケープエントリ?)とは何manですか?なぜファイルが見つからないのですか?どうすればより強力で効率的にすることができますか?


1. エラーがあるようです。標準エラー同じデータにどの実装/ソリューションを使用しても同じです。これはすごくそうです。

答え1

君はただ走れないman foo.gzあなたのように見えたできる実行中ですが、man foo.1.gz使用する方が-lきれいに見えます。からman man

   -l, --local-file
          Activate `local' mode.  Format and display  local  manual  files
          instead  of  searching  through  the system's manual collection.
          Each manual page argument will be interpreted as an nroff source
          file in the correct format.  No cat file is produced.  If '-' is
          listed as one of the arguments, input will be taken from  stdin.
          When  this  option  is  not used, and man fails to find the page
          required, before displaying the error message,  it  attempts  to
          act as if this option was supplied, using the name as a filename
          and looking for an exact match.

したがって、スクリプトは次のようにする必要があります。

#!/usr/bin/env bash
## synopses - extract all synopses in /usr/share/man/man1

## No need to cd into the directory, you can just use globs     
for i in /usr/share/man/man1/ajc*.gz; do
    ## This will print the name of the command.      
    basename "${i//.1.gz}"
    man -l "$i"  | 
       awk '/^SYNOPSIS/{a=1; getline}
            (/^[a-zA-z0-9_]/ && a==1){a=0} 
            (a==1 && /./){print}' | tr -s [:space:]

done

私が与えたコマンドはawkあなたのアプローチ(テストなどman ajc)よりもうまく機能し、今では複数行の要約でも機能します。表示されるエラーのほとんどはマイナーであり、他のエラーはファイル名の処理方法によって発生します。これがうまくいくかどうか教えてください。

答え2

発生したエラーに関して、すべてここで解決されました。

man man

MANWIDTH-$MANWIDTH設定されている場合、その値はマニュアルページをフォーマットする必要がある行の長さとして使用されます。設定しないと、マニュアルページは現在の端末に適した行長にフォーマットされます(使用可能な場合はioctl(2)値を使用する$COLUMNSか、両方が使用できない場合は80文字に置き換えます)。 Catページは、デフォルトの形式が利用可能な場合、つまり端末行の長さが66から80文字の間にのみ保存されます。

MAN_KEEP_FORMATTING- 通常、出力が端末(ファイルやパイプなど)として指定されていない場合は、特別なツールなしで結果を読みやすくするためにフォーマット文字が削除されます。ただし、$MAN_KEEP_FORMATTINGNULL以外の値に設定すると、これらの書式文字は保持されます。これは、書式設定文字を解釈できるmanラッパーに役立ちます。

MAN_KEEP_STDERR- 通常、出力が端末(通常はページャ)に渡されると、マニュアルページのフォーマットされたバージョンを生成するために使用されたコマンドの誤った出力は、ページャの表示を妨げないように削除されます。このようなプログラムは、groffマニュアルページと一緒に表示されたときに見苦しく、しばしば混乱する印刷問題(誤ったソートなど)に関する比較的マイナーなエラーメッセージを生成することがよくあります。ただし、一部のユーザーはこれを見たいので、$MAN_KEEP_STDERRnull以外の値に設定するとエラー出力が通常どおり表示されます。

次に、他のタスクを実行する方法について説明します。

私はこれがあなたの要件を満たしていると思います。

for f in /usr/share/man/man1/*gz ; do
    man -P "sed -ne '1,/^[Nn]/d;/^ /{H;b}
    /^[Ss]..[Yy]..[Nn]/{g;:n
    N;/\n\(\n\)[^ ].*/!bn;s//\1/
    s/.\x08//g;s/\(\n\)  */\1/g;
    w /dev/stderr' -ne '};/./q'" -l "$f"
done 2>~/file

次の行のみを出力するように指定しますsedPAGER名前そして次の人要約他のEphemerに会うまで<space>。それは印刷する何もない最初の行が<space>次から始まらない場合名前不一致が始まります[Ss][Yy][Nn]。それぞれの場合、2行目のファイルの読み取りを完全に停止します。名前で始まらない<space>。出力から先行スラッシュ<spaces>とすべてのバックスラッシュを消去します。\b

for私はこれを繰り返し実行しましたが、ライブラリman全体を見るのに1分しかかかりませんでした。

man端末に書き込むかパイプ/ファイルに書き込むかによって出力を調整します。したがって、これを行うように指示すると、ポケットベルを完全に放棄します。これは予期しないことです。しかし、私はそれをだまして、sedのwrite関数を使用して>&2に書き込んでリダイレクトしたので、合理的ではありませんでした。

しかし、@terdonがおそらくより良いアプローチであることに注意することが重要です。各ファイルをインポートするので、カスタマイズしやすく、sed端末の幅に合わせようとしないため、フォーマットは少し良いですが、明らかにman\ backslashesは書きません|pipe

関連情報