linuxbashgrepcommand-line-interfacemanpage

Man page NAME (and the line under it) and DESCRIPTION (and lines under) in grep or


I am trying to condense a list of man pages for various tools to just:

NAME
    ls – list directory contents
DESCRIPTION
     For each operand that names a file of a type other than directory, ls displays its name as well as any requested, associated information.  For each operand that names a file of
     type directory, ls displays the names of files contained within that directory, as well as any requested, associated information.

The output should be the full NAME section and the full DESCRIPTION section. So when I type man <tool name> | awk/grep/etc it comes out like the code above.

I have tried to man ls | grep "NAME" and different variations of this. man ls | col -bx | awk '/^[A-Z ]+$/ {print}' which only gives me the Title name. And all sorts of combinations that lead me no where. Any suggestions?


Solution

  • Your question isn't clear but maybe this is what you want as it looks like what you posted as expected output?

    $ man ls | awk -v RS= '/^(NAME|DESCRIPTION)/'
    NAME
           ls - list directory contents
    DESCRIPTION
           List  information  about the FILEs (the current directory by default).  Sort entries alphabetically if none
           of -cftuvSUX nor --sort is specified.
    

    but you say you want the full DESCRIPTION so then that'd be:

    $ man ls | awk '
        /^[[:alnum:]]/{ prt(); rec="" }
        { rec = rec $0 ORS }
        END { prt() }
        function prt() {
            gsub(/^[[:space:]]+|[[:space:]]+$/,"",rec)
            if ( rec ~ /^(NAME|DESCRIPTION)/ ) {
                print rec
            }
        }
    '
    NAME
           ls - list directory contents
    DESCRIPTION
           List  information  about the FILEs (the current directory by default).  Sort entries alphabetically if none
           of -cftuvSUX nor --sort is specified.
    
           Mandatory arguments to long options are mandatory for short options too.
    
           -a, --all
                  do not ignore entries starting with .
    
           -A, --almost-all
                  do not list implied . and ..
    
           --author
                  with -l, print the author of each file
    
           -b, --escape
                  print C-style escapes for nongraphic characters
    
           --block-size=SIZE
                  with -l, scale sizes by SIZE when printing them; e.g., '--block-size=M'; see SIZE format below
    
           -B, --ignore-backups
                  do not list implied entries ending with ~
    
           -c     with -lt: sort by, and show, ctime (time of last modification of file status information); with  -l:
                  show ctime and sort by name; otherwise: sort by ctime, newest first
    
           -C     list entries by columns
    
           --color[=WHEN]
                  colorize the output; WHEN can be 'always' (default if omitted), 'auto', or 'never'; more info below
    
           -d, --directory
                  list directories themselves, not their contents
    
           -D, --dired
                  generate output designed for Emacs' dired mode
    
           -f     list all entries in directory order
    
           -F, --classify[=WHEN]
                  append  indicator  (one of */=>@|) to entries; WHEN can be 'always' (default if omitted), 'auto', or
                  'never'
    
           --file-type
                  likewise, except do not append '*'
    
           --format=WORD
                  across -x, commas -m, horizontal -x, long -l, single-column -1, verbose -l, vertical -C
    
           --full-time
                  like -l --time-style=full-iso
    
           -g     like -l, but do not list owner
    
           --group-directories-first
                  group directories before files;
    
                  can be augmented with a --sort option, but any use of --sort=none (-U) disables grouping
    
           -G, --no-group
                  in a long listing, don't print group names
    
           -h, --human-readable
                  with -l and -s, print sizes like 1K 234M 2G etc.
    
           --si   likewise, but use powers of 1000 not 1024
    
           -H, --dereference-command-line
                  follow symbolic links listed on the command line
    
           --dereference-command-line-symlink-to-dir
                  follow each command line symbolic link
    
                  that points to a directory
    
           --hide=PATTERN
                  do not list implied entries matching shell PATTERN (overridden by -a or -A)
    
           --hyperlink[=WHEN]
                  hyperlink file names; WHEN can be 'always' (default if omitted), 'auto', or 'never'
    
           --indicator-style=WORD
                  append  indicator  with  style  WORD  to  entry  names:  none  (default),  slash   (-p),   file-type
                  (--file-type), classify (-F)
    
           -i, --inode
                  print the index number of each file
    
           -I, --ignore=PATTERN
                  do not list implied entries matching shell PATTERN
    
           -k, --kibibytes
                  default to 1024-byte blocks for file system usage; used only with -s and per directory totals
    
           -l     use a long listing format
    
           -L, --dereference
                  when showing file information for a symbolic link, show information for the file the link references
                  rather than for the link itself
    
           -m     fill width with a comma separated list of entries
    
           -n, --numeric-uid-gid
                  like -l, but list numeric user and group IDs
    
           -N, --literal
                  print entry names without quoting
    
           -o     like -l, but do not list group information
    
           -p, --indicator-style=slash
                  append / indicator to directories
    
           -q, --hide-control-chars
                  print ? instead of nongraphic characters
    
           --show-control-chars
                  show nongraphic characters as-is (the default, unless program is 'ls' and output is a terminal)
    
           -Q, --quote-name
                  enclose entry names in double quotes
    
           --quoting-style=WORD
                  use quoting style  WORD  for  entry  names:  literal,  locale,  shell,  shell-always,  shell-escape,
                  shell-escape-always, c, escape (overrides QUOTING_STYLE environment variable)
    
           -r, --reverse
                  reverse order while sorting
    
           -R, --recursive
                  list subdirectories recursively
    
           -s, --size
                  print the allocated size of each file, in blocks
    
           -S     sort by file size, largest first
    
           --sort=WORD
                  sort by WORD instead of name: none (-U), size (-S), time (-t), version (-v), extension (-X), width
    
           --time=WORD
                  change  the  default  of using modification times; access time (-u): atime, access, use; change time
                  (-c): ctime, status; birth time: birth, creation;
    
                  with -l, WORD determines which time to show; with --sort=time, sort by WORD (newest first)
    
           --time-style=TIME_STYLE
                  time/date format with -l; see TIME_STYLE below
    
           -t     sort by time, newest first; see --time
    
           -T, --tabsize=COLS
                  assume tab stops at each COLS instead of 8
    
           -u     with -lt: sort by, and show, access time; with -l: show access time and  sort  by  name;  otherwise:
                  sort by access time, newest first
    
           -U     do not sort; list entries in directory order
    
           -v     natural sort of (version) numbers within text
    
           -w, --width=COLS
                  set output width to COLS.  0 means no limit
    
           -x     list entries by lines instead of by columns
    
           -X     sort alphabetically by entry extension
    
           -Z, --context
                  print any security context of each file
    
           --zero end each output line with NUL, not newline
    
           -1     list one file per line
    
           --append-exe
                  append .exe if cygwin magic was needed
    
           --help display this help and exit
    
           --version
                  output version information and exit
    
           The  SIZE  argument  is  an integer and optional unit (example: 10K is 10*1024).  Units are K,M,G,T,P,E,Z,Y
           (powers of 1024) or KB,MB,... (powers of 1000).  Binary prefixes can be used, too: KiB=K, MiB=M, and so on.
    
           The TIME_STYLE argument can be full-iso, long-iso, iso, locale, or +FORMAT.  FORMAT is interpreted like  in
           date(1).  If FORMAT is FORMAT1<newline>FORMAT2, then FORMAT1 applies to non-recent files and FORMAT2 to re‐
           cent files.  TIME_STYLE prefixed with 'posix-' takes effect  only  outside  the  POSIX  locale.   Also  the
           TIME_STYLE environment variable sets the default style to use.
    
           Using  color  to  distinguish  file  types  is  disabled  both  by  default  and  with --color=never.  With
           --color=auto, ls emits color codes only when standard output is connected to a terminal.  The LS_COLORS en‐
           vironment variable can change the settings.  Use the dircolors command to set it.
    
       Exit status:
           0      if OK,
    
           1      if minor problems (e.g., cannot access subdirectory),
    
           2      if serious trouble (e.g., cannot access command-line argument).