ম্যান পৃষ্ঠাগুলি অনুসন্ধান করুন যা 'foo' 'বার' এবং 'বাজ' শব্দের সমস্ত ধারণ করে


12

আমি ম্যান পৃষ্ঠাগুলি সন্ধান করতে চাই যার মধ্যে 'ফু', 'বার' এবং 'বাজ' শব্দটির সমস্ত শব্দ রয়েছে।

যদি সম্ভব হয় তবে আমি সমস্ত ম্যান পৃষ্ঠাগুলির সমস্ত পাঠ্য (কেবল নাম এবং বিবরণ নয়) অনুসন্ধান করতে চাই।

আমি এমন কিছু অনুমান করছি

man -K foo AND bar AND baz

আমার স্ক্রিপ্ট কাজ করেছে? আপনি কোনও প্রতিক্রিয়া
জানাননি

উত্তর:


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
অদ্ভুত তবে ^ সত্য ^ - তবে সময় অপচয় করার পক্ষে ভোট দেওয়া মজাদার ছিল ...
মাইকেসার্ভ

বিভিন্ন যুক্তি ব্যবহার করে কেবল তা করে or, আমি কেবলমাত্র এটি ভেবেছিলাম andকারণ এটি সঠিকভাবে পরীক্ষা করা হয়নি।
গ্রিম

3

এটি স্ক্রিপ্টিং সম্পর্কে কিছু চিন্তা:

  • manpathম্যান পৃষ্ঠাগুলির অবস্থান (গুলি) পেতে ব্যবহার করে। আমি যদি আমার যুক্ত /home/graeme/.cabal/binকরে PATH, manpath(এবং man) ম্যান পৃষ্ঠাগুলি খুঁজে পাবে /home/graeme/.cabal/share/man

  • অনুসন্ধানের আগে পৃষ্ঠাগুলিকে সংক্ষেপিত করতে এবং বিন্যাস করতে নিজেই মানুষটিকে ব্যবহার করুন, আপনি কেবল ম্যান পাঠ্যটি নিজেই অনুসন্ধান করছেন এবং কাঁচা ফাইলে কোনও মন্তব্য নেই। ব্যবহার করা manএকাধিক ফর্ম্যাটগুলির সাথে সম্ভাব্যভাবে ডিল করবে।

  • একটি টেম্পাইলে ফর্ম্যাট করা পৃষ্ঠাগুলি সংরক্ষণ করা একাধিক ডিকম্প্রেসেশনগুলি এড়াতে সক্ষম হবে এবং জিনিসগুলিকে উল্লেখযোগ্যভাবে গতি বাড়িয়ে তুলতে হবে।

এখানে যায় ( bashজিএনইউ সহ এবং সন্ধান করুন):

#!/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- যা নাও হতে পারে কি আপনি চান (আপনার পছন্দের মিল অন্তর্ভুক্ত করতে চান না foo বিন্যাস lish এবং বাদাম বার ?)


আপনাকে জিজ্ঞাসা করতে খুব ভদ্র।
মাইকসার্ভ

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.