สมมติว่าฉันต้องการทราบการใช้งาน-i
สวิตช์ในgrep
คำสั่งโดยไม่ต้องเลื่อน ฉันต้องการสเปคเพียงแค่สำหรับคำสั่งนั้นหรืออย่างน้อยก็เห็นหน้าจอแสดงว่าก่อน ดังนั้นวิธีการที่? grep -i
ในขณะที่คุณสามารถพูดได้ว่าโดยทั่วไปไม่ได้เป็นเพียง
สมมติว่าฉันต้องการทราบการใช้งาน-i
สวิตช์ในgrep
คำสั่งโดยไม่ต้องเลื่อน ฉันต้องการสเปคเพียงแค่สำหรับคำสั่งนั้นหรืออย่างน้อยก็เห็นหน้าจอแสดงว่าก่อน ดังนั้นวิธีการที่? grep -i
ในขณะที่คุณสามารถพูดได้ว่าโดยทั่วไปไม่ได้เป็นเพียง
คำตอบ:
ลองใช้sed
คำสั่งง่ายๆนี้
$ man grep | sed -n '/-i, --ignore-case/,+2p'
-i, --ignore-case
Ignore case distinctions in both the PATTERN and the input
files. (-i is specified by POSIX.)
คำอธิบาย:
sed -n '/-i, --ignore-case/,+2p'
|<-Search pattern->|
มันจะพิมพ์บรรทัดที่มีรูปแบบการค้นหาพร้อมกับ 2 บรรทัดที่แสดงอยู่ด้านล่างไปยังบรรทัดรูปแบบการค้นหา
หรือ
คุณสามารถให้ค่าสถานะได้เฉพาะใน patten ด้านล่างเท่านั้น
avinash@avinash-Lenovo-IdeaPad-Z500:~$ man grep | sed -n '/ *i, -/,+3p'
-i, --ignore-case
Ignore case distinctions in both the PATTERN and the input
files. (-i is specified by POSIX.)
avinash@avinash-Lenovo-IdeaPad-Z500:~$ man grep | sed -n '/ *V, -/,+3p'
-V, --version
Print the version number of grep to the standard output stream.
This version number should be included in all bug reports (see
below).
avinash@avinash-Lenovo-IdeaPad-Z500:~$ man grep | sed -n '/ *F, -/,+3p'
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings, separated by
newlines, any of which is to be matched. (-F is specified by
POSIX.)
avinash@avinash-Lenovo-IdeaPad-Z500:~$ man grep | sed -n '/ *G, -/,+3p'
-G, --basic-regexp
Interpret PATTERN as a basic regular expression (BRE, see
below). This is the default.
คุณสามารถเพิ่มสคริปต์นี้ใน.bashrc
( $HOME/.bashrc
) เพื่อการเข้าถึงที่รวดเร็ว:
mangrep(){
USAGE="mangrep <application> <switch>"
if [[ "$#" -ne "2" ]]
then
echo "Usage: $USAGE"
else
man "$1" | sed -n "/ *"$2", -/,+3p"
fi
}
พิมพ์คำสั่งด้านล่างบนเทอร์มินัล:
man grep
จากนั้นพิมพ์ตัวอักษรเฉือน/และเขียนการค้นหาของคุณเช่นตามด้วย-i
Enterสิ่งนี้จะวางตำแหน่งเคอร์เซอร์ในการค้นหาสตริงครั้งแรก การกดnเลื่อนเคอร์เซอร์ไปที่การเกิดขึ้นครั้งถัดไป การกดShift+ nย้ายเคอร์เซอร์ไปที่เหตุการณ์ก่อนหน้า
-i
's man grep
page.But OP ต้องการเพียงคำอธิบายที่เกี่ยวข้องกับ-i
ธงในหน้าคน
-i
ไม่มีก็จะช่วยให้คุณวงจรผ่านการเกิดขึ้นของแต่ละคน นั่นคือสิ่งที่ OP ต้องการ
ในขณะที่วิธีการที่ง่ายที่สุดคือการค้นหาด้วย/คำแนะนำโดย @girardengo คุณสามารถใช้grep
แทนวิธีsed
ที่ฉันค้นหาได้ง่ายขึ้น:
$ man grep | grep -A 1 '^ *-i'
-i, --ignore-case
Ignore case distinctions in both the PATTERN and the input
files. (-i is specified by POSIX.)
ความ-A N
หมาย "พิมพ์ N บรรทัดหลังจากการจับคู่หนึ่งเพียงเคล็ดลับที่จะได้รับไม่กี่บรรทัดถัดไปคล้ายกับแนวทางของ Avinash sed
คุณสามารถใช้ฟังก์ชั่นการค้นหาข้างในman
เพียง"s"
กดปุ่มพิมพ์ที่คุณต้องการ (-i ในกรณีของคุณ) และกดปุ่มอินโทร
หรือคุณสามารถให้เว็บไซต์นี้ทำการค้นหาให้คุณ:
http://explainshell.com/explain?cmd=grep+-i
คุณต้องเปลี่ยนจากการใช้เทอร์มินัลเป็นเบราว์เซอร์สักหน่อย แต่ก็มีวิธีแก้ไขเช่นกัน
วิธีที่มีประสิทธิภาพที่สุดที่ฉันรู้คือการค้นหาหน้าคน-i
(เว็บไซต์นี้ดูเหมือนจะล้มเหลวในการแสดงรหัสของฉันสิ่งที่ฉันหมายถึงคือ<space><space><space>-i
) นั่นคือ 3 ช่องว่าง (คุณอาจต้องการช่องว่างมากขึ้น / น้อยลง) ตามด้วยธงที่คุณต้องการ มันใช้งานได้ในประสบการณ์ของฉันเกือบตลอดเวลาและคุณสามารถเปลี่ยนไปเป็นรุ่นที่แตกต่างกันในกรณีที่ใช้งานไม่ได้
มันทำงานได้เพราะเอกสารที่แท้จริงของธงมักจะเยื้อง มันหลีกเลี่ยงการค้นหาการกล่าวถึงธงอื่น ๆ ในส่วนอื่น ๆ เพราะโดยปกติจะมีช่องว่างหน้าเดียวเท่านั้น
ทุกคำตอบอาจใช้ได้ แต่ฉันคิดว่าคุณกำลังมุ่งเน้นไปที่เอกสารเพียงชิ้นเดียวไม่ใช่ทั้งหมด ตัวอย่างเช่นเพื่อค้นหา-i
สวิตช์ของเอกสารประกอบ grep:
info grep Invoking Command-line\ Options Matching\ Control
ฉันจะค้นหาข้อมูลทั้งหมดเกี่ยวกับ "grep" วิธีการ "เรียกใช้" ตัวเลือกบรรทัดคำสั่งเฉพาะ "สำหรับ" การควบคุมการจับคู่ " น่าเศร้าที่มันไม่ได้ไปมากขึ้นลึกลงไปกว่านั้น แต่มันก็มี-i
, -y
, --ignore-case
ในที่หนึ่ง 25 เส้นบางสิ่งบางอย่างที่เหมาะสมที่คุณไม่ต้องเลื่อนทั้งหมดลงในแบบของคุณ
โซลูชันนี้มีความยืดหยุ่นมากขึ้นและช่วยให้คุณสามารถค้นหาข้อมูลทั้งหมดได้:
info --apropos=--ignore-case
"(coreutils)join invocation" -- --ignore-case <1>
"(coreutils)uniq invocation" -- --ignore-case <2>
"(coreutils)sort invocation" -- --ignore-case
"(gettext)msggrep Invocation" -- --ignore-case, ‘msggrep’ option
"(grep)Matching Control" -- --ignore-case
(ต้องใช้--ignore-case
แทน-i
เนื่องจากเป็นเรื่องธรรมดาเกินไป แต่คุณสามารถประมวลผลผลลัพธ์เป็นข้อมูลได้ในทุกกรณี)
ในกรณีนี้คุณมีทั้งชื่อของหน้าข้อมูลและส่วนที่แน่นอน อ่าเกือบลืมไปเลยว่าคุณสามารถtabผ่านหน้าข้อมูลส่วนใหญ่ได้
คุณสามารถใช้ Perl และ "โหมดย่อหน้า" เพื่อแยกเฉพาะย่อหน้าที่เกี่ยวข้อง:
man grep | perl -00 -ne 'print if / -i/'
วิธีการที่ฉันชอบที่จะหาตัวเลือกที่ได้รับในman
หน้าคือการใช้ regex \s{2,}-option
เช่น สำหรับคำถามที่มีอยู่ในมือคุณสามารถทำได้man grep
แล้วพิมพ์ regex:
/\s{3,}-i
หรือ
/ {3,}-i
^------------- space here
สิ่งนี้จะจับคู่-i
เมื่อตามด้วยช่องว่างสามช่องขึ้นไป
ในฐานะที่less
ถูกใช้โดยเริ่มต้นเป็นเพจเจอร์สำหรับman
คุณสามารถใช้LESS
ตัวแปรสภาพแวดล้อมที่จะผ่านรูปแบบการค้นหาเมื่อless
เปิดหน้าเว็บ นี้เป็นเหมือนการทำเช่นman ls
นั้นค้นหาตัวเลือก--all
หรือ-a
โดยการพิมพ์/แล้วป้อนเช่นรูปแบบหรือ--all
-a
สิ่งเหล่านี้สามารถทำได้โดย:
LESS='+/--all' man ls
หรือ
LESS='+/-a' man ls
/
ป้อนข้อมูลในสิ่งที่คุณต้องการค้นหาหลังจาก
สันนิษฐานว่าสิ่งนี้ทำงานได้ดีที่สุดสำหรับตัวเลือกแบบยาว (เช่น--all
) เมื่อเปรียบเทียบกับตัวเลือกแบบสั้น (เช่น-a
)
หากคุณต้องการผลการค้นหาสำหรับรูปแบบที่เริ่มต้นด้วยยัติภังค์ใช้
ก่อนที่รูปแบบที่คุณระบุ ตัวอย่างการใช้:grep
man <program>
--
man find
man find | grep -- -type
หากคุณต้องการข้อมูลเพิ่มเติมเช่นส่วนทั้งหมดอธิบายตัวเลือกลองใช้sed
:
$ man find | sed -n '/-mindepth/,/^$/p'
-mindepth levels
Do not apply any tests or actions at levels less than levels (a
non-negative integer). -mindepth 1 means process all files
except the command line arguments.