उन मैन पेजों की खोज करें जिनमें 'फू' 'बार' और 'बाज' शब्द शामिल हैं।


12

मैं उन मैन पेजों की खोज करना चाहता हूँ, जिनमें 'फू', 'बार' और 'बाज' जैसे सभी शब्द हैं।

यदि संभव हो, तो मैं सभी मैन पेजों के सभी पाठ (केवल नाम और विवरण नहीं) के माध्यम से खोजना चाहूंगा।

मैं कुछ ऐसा अनुमान लगा रहा हूं

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


एक स्क्रिप्ट की तरह लग रहा है सब के बाद एक ही रास्ता है।
ग्रीम

2
अजीब लेकिन ^ सत्य ^ - लेकिन यह समय की बर्बादी के लिए वोट करने के लिए मजेदार था ...
mikeserv

अलग-अलग तर्कों का उपयोग करते हुए or, मैंने केवल यह सोचा था andक्योंकि मैंने इसे ठीक से परीक्षण नहीं किया था।
ग्रीम

3

इसे पटकथा पर कुछ विचार:

  • manpathआदमी पृष्ठों के स्थान (ओं) को प्राप्त करने के लिए उपयोग करना । अगर मैं /home/graeme/.cabal/binअपने को जोड़ूं PATH, manpath(और man) मैन पेजों को खोजेगा /home/graeme/.cabal/share/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

@ पॉलिम के उत्तर के रूप में पूर्ण नहीं है, लेकिन मैं ऐसा कुछ सुझाव देने जा रहा था

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- जो आप नहीं चाहते हैं (क्या आप फू लिश और नट बार जैसे मैचों को शामिल करना चाहते हैं ?)


आप से पूछने के लिए बहुत विनम्र।
मिकसेर

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[@]}"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.