搜索包含所有单词“ foo”,“ bar”和“ baz”的手册页


12

我想搜索包含所有单词'foo','bar'和'baz'的手册页。

如果可能的话,我想搜索所有手册页的所有文本(不仅仅是名称和描述)。

我猜是这样的

man -K foo AND bar AND baz

我的脚本有效吗?您未提供任何反馈:)
polym 2014年

Answers:


5

我实现了一个脚本,正是这样做的。

if [ $# -eq 0 ]; then
  PATTERNS=(NAME AUTHOR EXAMPLES FILES)
else
  PATTERNS=( "$@" )
fi

[ ${#PATTERNS[@]} -lt 1 ] && echo "Needs at least 1 pattern to search for" && exit 1

for i in $(find /usr/share/man/ -type f); do
  TMPOUT=$(zgrep -l "${PATTERNS[0]}" "$i")
  [ -z "$TMPOUT" ] && continue

  for c in `seq 1 $((${#PATTERNS[@]}-1))`; do
    TMPOUT=$(echo "$TMPOUT" | xargs zgrep -l "${PATTERNS[$c]}")
    [ -z "$TMPOUT" ] && break
  done

  if [ ! -z "$TMPOUT" ]; then
    #echo "$TMPOUT" # Prints the whole path
    MANNAME="$(basename "$TMPOUT")"
    man "${MANNAME%%.*}"
  fi
done

猜猜那是浪费时间:(

编辑:好像

man -K expr1 expr2 expr3

没有工作吗?

编辑:您现在可以通过通过搜索条件传递脚本 ./script foo bar


看起来脚本毕竟是唯一的方法。
Graeme 2014年

2
奇怪但^ true ^-但是浪费时间投票很有趣...
mikeserv 2014年

使用不同的参数就可以了or,我只是以为是and因为我没有正确测试它。
Graeme 2014年

3

关于编写脚本的几点思考:

  • 使用manpath获得的手册页的位置(一个或多个)。如果我添加/home/graeme/.cabal/bin到我的PATHmanpath(和man)会发现在手册页/home/graeme/.cabal/share/man

  • 在搜索之前,使用man本身对页面进行解压缩和格式化,这样您就可以搜索man文本本身,而无需搜索原始文件中的任何注释等。使用man将潜在地处理多种格式。

  • 将格式化的页面保存在临时文件中将避免多次解压缩,并应大大加快速度。

这就是(bash和GNU查找):

#!/bin/bash

set -f; IFS=:
trap 'rm -f "$temp"' EXIT
temp=$(mktemp --tmpdir search_man.XXXXXXXXXX)

while IFS= read -rd '' file; do
  man "$file" >"$temp" 2>/dev/null

  unset fail
  for arg; do
    if ! grep -Fq -- "$arg" "$temp"; then
      fail=true
      break
    fi
  done

  if [ -z "$fail" ]; then
    file=${file##*/}
    printf '%s\n' "${file%.gz}"
  fi
done < <(find $(manpath) -type d ! -name 'man*' -prune -o -type f -print0)

2

不如@polym的答案完整,但我将建议类似

while IFS= read -rd $'\0' f; do 
  zgrep -qwm1 'foo' "$f" && \
  zgrep -qwm1 'bar' "$f" && \
  zgrep -qwm1 'baz' "$f" && \
  printf '%s\n' "$f"
done < <(find /usr/share/man -name '*.gz' -print0)

请注意,我在-上添加了一个-w(单词匹配)开关,greps这可能不是您想要的(要包括foo lish和nut bar这样的匹配吗?)


非常有礼貌的问你。
mikeserv

0

这种方法未经测试,但相当简单(愚蠢的简单方法),我希望它可以工作,即使效率不高:

#!/bin/bash

if [ "$#" -eq 0 ]; then
  echo "Provide arguments to search all man pages for all arguments." >&2
  echo "Putting rare search terms first will improve performance." >&2
  exit
fi

if [ "$#" -eq 1 ]; then
  exec man -K "$@"
fi

pages=( $(man -wK "$1") )
shift
while [ "$#" -gt 1 ]; do
  pages=( $(zgrep -l "$1" "${pages[@]}") )
  shift
done
exec man "${pages[@]}"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.