"foo", "bar" 및 "baz"라는 단어가 모두 포함된 매뉴얼 페이지를 검색하고 싶습니다.
가능하다면 모든 매뉴얼 페이지의 모든 텍스트(이름과 설명뿐만 아니라)를 검색하고 싶습니다.
그런 것 같아요
man -K foo AND bar AND baz
답변1
이 작업을 수행하기 위해 스크립트를 구현했습니다.
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
답변2
이 스크립트 작성에 대한 몇 가지 생각:
manpath
매뉴얼 페이지의 위치를 가져오는 데 사용됩니다 ./home/graeme/.cabal/bin
내PATH
,manpath
(및 )에 추가하면man
매뉴얼 페이지는 에서 찾을 수 있습니다/home/graeme/.cabal/share/man
.man 자체를 사용하여 검색하기 전에 페이지의 압축을 풀고 형식을 지정하십시오. 그러면 원본 파일의 주석 등이 아닌 man 텍스트 자체만 검색할 수 있습니다. 를 사용하면
man
여러 형식을 처리할 수 있습니다.서식이 지정된 페이지를 임시 파일에 저장하면 여러 번의 압축 해제를 방지하고 속도를 크게 높일 수 있습니다.
다음과 같이( bash
GNU find 사용):
#!/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)
답변3
@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
부자리쉬와 견과류술집? )
답변4
이 접근 방식은 테스트되지 않았지만 매우 간단하며(어리석을 정도로 간단함) 비효율적이라도 작동할 것으로 기대합니다.
#!/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[@]}"