'foo' 'bar'및 'baz'단어가 모두 포함 된 매뉴얼 페이지를 검색하십시오.


12

'foo', 'bar'및 'baz'라는 단어가 모두 포함 된 매뉴얼 페이지를 검색하고 싶습니다.

가능하면 모든 매뉴얼 페이지의 모든 텍스트 (이름 및 설명뿐만 아니라)를 검색하고 싶습니다.

나는 같은 것을 추측하고있다.

man -K foo AND bar AND baz

스크립트가 작동 했습니까? u는 아무런 피드백도주지 않았습니다 :)
polym

답변:


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

2
이상하지만 ^ true ^-그러나 시간 낭비에 투표하는 것은 재미 있었습니다 ...
mikeserv

다른 인수를 사용 하면 제대로 테스트하지 않았기 때문에 or생각했습니다 and.
Graeme

3

스크립팅에 대한 몇 가지 생각 :

  • manpath매뉴얼 페이지의 위치를 ​​얻는 데 사용 합니다. 내가 추가하면 /home/graeme/.cabal/binPATH, manpath(그리고 man)의 맨 페이지를 찾을 수 있습니다 /home/graeme/.cabal/share/man.

  • man 자체를 사용하여 검색하기 전에 페이지를 압축 해제하고 형식을 지정하십시오. 이렇게하면 원시 파일의 주석 등이 아닌 man 텍스트 자체 만 검색 할 수 있습니다. 를 사용 man하면 여러 형식을 처리 할 수 ​​있습니다.

  • 서식 파일을 임시 파일에 저장하면 여러 압축 해제를 피할 수 있으며 속도가 크게 향상됩니다.

여기에 ( bashGNU 찾기 와 함께 ) :

#!/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는 어 및 너트 ?)


매우 정중 한 부탁입니다.
mikeserv 2016 년

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[@]}"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.