Grep या ack द्वारा लौटी लंबी मेल लाइनों को कैसे काटें


89

मैं उन HTML फ़ाइलों पर ack या grep चलाना चाहता हूं जिनमें अक्सर बहुत लंबी लाइनें होती हैं। मैं बहुत लंबी लाइनें नहीं देखना चाहता जो बार-बार लपेटती हैं। लेकिन मैं एक लंबी लाइन के उस हिस्से को देखना चाहता हूं जो एक स्ट्रिंग को घेरता है जो नियमित अभिव्यक्ति से मेल खाता है। मैं यूनिक्स उपकरणों के किसी भी संयोजन का उपयोग करके इसे कैसे प्राप्त कर सकता हूं?


1
क्या है ack? जब आप कुछ पसंद नहीं करते हैं तो क्या यह आपके द्वारा उपयोग की जाने वाली एक कमांड है? कुछ पसंद है ack file_with_long_lines | grep pattern? :-)
आलोक सिंघल

6
@ आलोक ack( ack-grepडेबियन पर जाना जाता है ) grepस्टेरॉयड पर है। इसका --thppptविकल्प भी है (मजाक नहीं)। betterthangrep.com
ZoogieZork

धन्यवाद। मैंने आज कुछ सीखा।
आलोक सिंघल

1
जबकि --thppptसुविधा कुछ हद तक विवादास्पद है, महत्वपूर्ण लाभ यह है कि आप पर्ल का उपयोग कर सकते प्रकट होता है सीधे, कुछ पागल नहीं regexes [[:space:]]और पात्रों की तरह {, [, आदि के साथ अर्थ बदल रहा -eहै और -Eएक तरीका है कि याद करने के लिए असंभव है में चला जाता है।
इवगेनी सर्गेव

जवाबों:


99

आप grep विकल्प का उपयोग कर सकते हैं -o, संभवतः अपने पैटर्न को बदलने के साथ संयोजन ".{0,10}<original pattern>.{0,10}"में इसके चारों ओर कुछ संदर्भ देखने के लिए:

       -ओ, - अकेला मिलान
              PATTERN से मेल खाने वाली मिलान रेखा का केवल एक भाग दिखाएं।

..or -c:

       -सी, --ाउंट
              सामान्य उत्पादन को दबाएं; इसके बजाय मिलान लाइनों की एक गिनती प्रिंट करें
              प्रत्येक इनपुट फ़ाइल के लिए। -V के साथ, - इनवर्ट-मैच विकल्प (देखें)
              नीचे), गैर-मिलान लाइनों को गिनें।

44
एक उदाहरण: grep -oE "। {0,20} mysearchstring। {0,20}" myfile
Renaud

14
आपको ऐड-ई विकल्प का उत्तर बदलना चाहिए जैसा कि @ रेनॉड (विस्तारित पैटर्न विकल्प) द्वारा दिखाया गया है, या संदर्भ के अभ्यस्त काम के लिए प्रस्तावित पैटर्न नहीं होगा।
13

यह आवश्यक नहीं है, लेकिन यहाँ एक उदाहरण है: $ echo "eeeeeeeeeeeeeeeeeeeeqqqqqqqqqqqqqqqqqqqqMYSTRINGwwwwwwwwwwwwwwwwwwwwrrrrrrrrrrrrrrrrrrrrr" > fileonelongline.txt && grep -oE ".{0,20}MYSTRING.{0,20}" ./fileonelongline.txt प्रिंटqqqqqqqqqqqqqqqqqqqqMYSTRINGwwwwwwwwwwwwwwwwwwww
उलीसा लैरे

यह अच्छी तरह से काम करता है; लेकिन उल्लेखनीय नकारात्मक यह है कि उपयोग करते समय, उदाहरण के लिए oE ".{0,20}mysearchstring.{0,20}", आप संदर्भ के खिलाफ आंतरिक "मूल" स्ट्रिंग के हाइलाइटिंग को खो देते हैं, क्योंकि पूरी चीज खोज पैटर्न बन जाती है। खोज परिणामों के आसपास कुछ गैर-हाइलाइट किए गए संदर्भों को रखने का एक तरीका खोजना पसंद करेंगे, बहुत आसान दृश्य स्कैनिंग और परिणाम व्याख्या के लिए।
एरॉन वालेंटाइन

1
ओह, यहां -oE ".{0,x}foo.{0,x}"दृष्टिकोण का उपयोग करने के कारण हाइलाइटिंग समस्या का समाधान है (जहां xसंदर्भ के पात्रों की संख्या है) - परिशिष्ट `| grep फू को `अंत तक। या तो ack या grep समाधान के लिए काम करता है। यहाँ भी अधिक समाधान: unix.stackexchange.com/questions/163726/…
एरॉन वालेंटाइन

44

अपने परिणामों को पाइप करें cut। मैं एक --cutस्विच जोड़ने पर भी विचार कर रहा हूं ताकि आप कह सकें --cut=80और केवल 80 कॉलम मिल सकें।


8
क्या होगा अगर मैच वाला हिस्सा पहले 80 अक्षरों में नहीं है?
ईथर

3
FWIW मैं | cut=c1-120grep में शामिल हुआ, मेरे लिए काम किया (हालांकि पता नहीं है कि कैसे मिलान पाठ के आसपास कटौती करने के लिए)
Jake Rayson

26
| cut=c1-120मेरे लिए काम नहीं किया, मुझे करने की ज़रूरत थी| cut -c1-120
केन कोचरन

1
मुझे लगता है कि @edib वाक्य-विन्यास | cut -c 1-100 stackoverflow.com/a/48954102/1815624
CrandellWS

1
@AndyLester: एक --no-wrapविकल्प के बारे में क्या उपयोग करता है $COLUMNS?
n

25

आप ack के लिए एक पेजर के रूप में कम इस्तेमाल कर सकते हैं और लंबी लाइनों को काट सकते हैं: ack --pager="less -S" यह लंबी लाइन को बनाए रखता है, लेकिन इसे लपेटने के बजाय एक लाइन पर छोड़ देता है। अधिक रेखा देखने के लिए, तीर कुंजियों के साथ बाएं / दाएं स्क्रॉल करें।

मेरे पास ऐसा करने के लिए निम्न उपनाम सेटअप है:

alias ick='ack -i --pager="less -R -S"' 

2
कृपया ध्यान दें कि आप उस --pagerकमांड को अपनी ~ / .ackrc फ़ाइल में रख सकते हैं , यदि आप हमेशा इसका उपयोग करना चाहते हैं।
एंडी लेस्टर

यह इस समस्या का अब तक का सबसे अच्छा समाधान लगता है जो मुझे बहुत परेशान करता है। काश मुझे पता होता कि कैसे इस्तेमाल करना है ack
ब्रायन पीटरसन

@BrianPeterson ackबहुत ज्यादा पसंद है grep, केवल सबसे आम मामलों में सरल
हारून वालेंटाइन

8
cut -c 1-100

1 से 100 तक वर्ण प्राप्त करता है।


2

से लिया गया: http://www.topbug.net/blog/2016/08/18/truncate-long-matching-lines-of-grep-a-solution-that-preserves-color/

सुझाव दिया दृष्टिकोण ".{0,10}<original pattern>.{0,10}"पूरी तरह से अच्छा है सिवाय इसके कि हाइलाइटिंग रंग अक्सर गड़बड़ हो जाता है। मैंने एक समान आउटपुट वाली स्क्रिप्ट बनाई है, लेकिन रंग भी संरक्षित है:

#!/bin/bash

# Usage:
#   grepl PATTERN [FILE]

# how many characters around the searching keyword should be shown?
context_length=10

# What is the length of the control character for the color before and after the
# matching string?
# This is mostly determined by the environmental variable GREP_COLORS.
control_length_before=$(($(echo a | grep --color=always a | cut -d a -f '1' | wc -c)-1))
control_length_after=$(($(echo a | grep --color=always a | cut -d a -f '2' | wc -c)-1))

grep -E --color=always "$1" $2 |
grep --color=none -oE \
    ".{0,$(($control_length_before + $context_length))}$1.{0,$(($control_length_after + $context_length))}"

मान लिया जाए कि स्क्रिप्ट को सहेज लिया गया है grepl, तब grepl pattern file_with_long_linesमिलान लाइनों को प्रदर्शित करना चाहिए लेकिन मिलान स्ट्रिंग के चारों ओर केवल 10 वर्णों के साथ।


काम करता है, लेकिन इस तरह से मेरे लिए ट्रंक कबाड़ का उत्पादन करता है: ^ [[? 62; 9; c। मैंने डिबगिंग की कोशिश नहीं की क्योंकि @ जोना ब्रौन के जवाब ने मुझे संतुष्ट किया।
sondra.kinsey

1

यहाँ मैं क्या कर रहा हूँ:

function grep () {
  tput rmam;
  command grep "$@";
  tput smam;
}

मेरे .bash_profile में, मैं grep को ओवरराइड करता हूं ताकि यह स्वचालित रूप से tput rmamपहले और tput smamबाद में चले, जो कि रैपिंग को अक्षम कर देता है और फिर इसे फिर से सक्षम करता है।


यह एक अच्छा विकल्प है - सिवाय इसके कि अगर वास्तविक मैच फिर स्क्रीन से बाहर हो जाए ...
ज़ेरुस

1

यहाँ छवि विवरण दर्ज करें

असामान्य स्थिति में जहां आप उपयोग नहीं -Eकर सकते, आप उपयोग कर सकते हैं:

grep -oe ".\{0,10\}error.\{0,10\}" mylogfile.txt

0

मैं निम्नलिखित में डाल दिया .bashrc:

grepl() {
    $(which grep) --color=always $@ | less -RS
}

फिर आप greplकिसी भी तर्क के साथ कमांड लाइन पर उपयोग कर सकते हैं grep। लंबी लाइनों की पूंछ देखने के लिए तीर कुंजियों का उपयोग करें। qछोड़ने के लिए उपयोग करें ।

स्पष्टीकरण:

  • grepl() {: एक नए फ़ंक्शन को परिभाषित करें जो हर (नए) बैश कंसोल में उपलब्ध होगा।
  • $(which grep): पूरा रास्ता पाओ grep। (उबंटू इसके लिए एक उपनाम को परिभाषित करता है grepजो इसके बराबर है grep --color=auto। हम उस उपनाम को नहीं बल्कि मूल चाहते हैं grep।)
  • --color=always: आउटपुट को रंगीन करें। ( --color=autoउर्फ से grepपता नहीं चलेगा क्योंकि पता चलता है कि आउटपुट एक पाइप में डाल दिया गया है और फिर इसे रंग नहीं देगा।)
  • $@: greplफंक्शन में दिए गए सभी तर्कों को यहाँ रखें।
  • less: लाइनों का उपयोग कर प्रदर्शित करें less
  • -R: रंग दिखाओ
  • S: लंबी लाइनें न तोड़ें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.