How to search through manual pages

It was almost three years ago when I wrote about manual pages. Moving forward, I want to share simple and useful shell script to search through manual pages.

Shell script

Store man_search.sh shell script.

#!/bin/sh
# search through man pages
# Source: https://blog.sleeplessbeastie.eu/2016/06/06/how-to-search-through-manual-pages/
#
# Usage:
# man_search.sh manual_name search_pattern
#
# Examples:
# man_search.sh ^tar absolute
# man_search.sh fopen fopen\( 

# use colors: always, never
grep_colors="always"

# display surrounding lines
grep_lines="1"

if [ "$#" -eq 2 ]; then
  manual="$1"
  pattern="$2"

  manuals=$(man -k $1) # Important:
                       # Use "-k" parameter or "-f" if you want to be strict

  echo "$manuals" | while read manual_line; do
    manual_page=$(echo $manual_line | sed 's/\(.*\) (.*) [ ]*- .*/\1/')
    manual_section=$(echo $manual_line | sed 's/.* (\(.*\)) [ ]*- .*/\1/')

    matches=$(man $manual_section $manual_page 2>/dev/null | grep --color=$grep_colors -C $grep_lines -e "$pattern")

    if [ -n "$matches" ]; then
      echo "$matches" | while read match; do
        echo "$manual_page ($manual_section): $match"
      done
    fi
  done 
fi

Use grep_colors variable to use colors and grep_lines to define number of surrounding lines.

Examples

$ sh man_search.sh ^tar absolute
  
tar (1): 
tar (1): -P, --absolute-names
tar (1): don't strip leading '/'s from file names

$ sh  man_search.sh ^test$ newer
test (1): FILE1 -nt FILE2
test (1): FILE1 is newer (modification date) than FILE2

$ sh man_search.sh fopen fopen\(
fopen (3): 
fopen (3): FILE *fopen(const char *path, const char *mode);
fopen (3): 
fopen (3): --
fopen (3): DESCRIPTION
fopen (3): The  fopen() function opens the file whose name is the string pointed to by path and associates a stream with
fopen (3): it.
fopen (3): --
fopen (3): pointed  to by stream with it.  The original stream (if it exists) is closed.  The mode argument is used just
fopen (3): as in the fopen() function.  The primary use of the freopen() function is to change the file associated  with
fopen (3): a standard text stream (stderr, stdin, or stdout).
fopen (3): --
fopen (3): RETURN VALUE
fopen (3): Upon  successful  completion  fopen(),  fdopen()  and  freopen()  return  a FILE pointer.  Otherwise, NULL is
fopen (3): returned and errno is set to indicate the error.
fopen (3): --
fopen (3): ERRORS
fopen (3): EINVAL The mode provided to fopen(), fdopen(), or freopen() was invalid.
fopen (3): 
fopen (3): The fopen(), fdopen() and freopen() functions may also fail and set errno for any of the errors specified for
fopen (3): the routine malloc(3).
fopen (3): 
fopen (3): The fopen() function may also fail and set errno for any of the errors specified for the routine open(2).
fopen (3): 
fopen (3): --
fopen (3): CONFORMING TO
fopen (3): The fopen() and freopen() functions conform to C89.  The fdopen() function conforms to POSIX.1-1990.
fopen (3): 
fopen (3): --
fopen (3): 
fopen (3): x      Open  the  file  exclusively  (like  the O_EXCL flag of open(2)).  If the file already exists, fopen()
fopen (3): fails, and sets errno to EEXIST.  This flag is ignored for fdopen().
fopen (3): 
fopen (3): In addition to the above characters, fopen() and freopen() support the following syntax in mode:
fopen (3): 
fopen (3): --
fopen (3): When parsing for individual flag characters in mode (i.e., the characters preceding the "ccs" specification),
fopen (3): the  glibc implementation of fopen() and freopen() limits the number of characters examined in mode to 7 (or,
fopen (3): in glibc versions before 2.14, to 6, which  was  not  enough  to  include  possible  specifications  such  as
fopencookie (3): 
fopencookie (3): The fopencookie() function serves a purpose similar to fopen(3): it opens a new stream and returns a  pointer
fopencookie (3): to a FILE object that is used to operate on that stream.
fopencookie (3): --
fopencookie (3): 
fopencookie (3): The  mode  argument serves the same purpose as for fopen(3).  The following modes are supported: r, w, a, r+,
fopencookie (3): w+, and a+.  See fopen(3) for details.
fopencookie (3): 
fopencookie (3): --
fopencookie (3): SEE ALSO
fopencookie (3): fclose(3), fmemopen(3), fopen(3), fseek(3)

References

How to open manual page at the specific page section blog post

Milosz Galazka's Picture

About Milosz Galazka

Milosz is a Linux Foundation Certified Engineer working for a successful Polish company as a system administrator and a long time supporter of Free Software Foundation and Debian operating system. He is also open for new opportunities and challenges.

Gdansk, Poland https://sleeplessbeastie.eu