जवाबों:
cmd | while read line; do echo "[ERROR] $line"; done
केवल बैश बिल्डरों का उपयोग करने का लाभ है, इसलिए कम प्रक्रियाएं बनाई जाएंगी / नष्ट हो जाएंगी, इसलिए यह awk या sed की तुलना में तेजी से स्पर्श होना चाहिए।
@tzrik बताते हैं कि यह एक अच्छा बैश फंक्शन भी कर सकता है। इसे परिभाषित करना:
function prepend() { while read line; do echo "${1}${line}"; done; }
इसे उपयोग करने की अनुमति देगा:
cmd | prepend "[ERROR] "
sed
) या यहां तक कि स्ट्रिंग विभाजन ( awk
) का उपयोग नहीं किया जाता है।)
function prepend() { while read line; do echo "${1}${line}"; done; }
इसे इस्तेमाल करे:
cmd | awk '{print "[ERROR] " $0}'
चियर्स
awk -vT="[ERROR] " '{ print T $0 }'
याawk -vT="[ERROR]" '{ print T " " $0 }'
T="[ERROR] " awk '{ print ENVIRON["T"] $0 }'
याT="[ERROR]" awk '{ print ENVIRON["T"] " " $0 }'
cmd | awk '{print "['$V]' " $0}'
- इसका मूल्यांकन एक बार शुरू होने के बाद किया जाना चाहिए, इसलिए कोई प्रदर्शन ओवरहेड नहीं होता है।
@Grawity के सभी श्रेय के साथ, मैं उनकी टिप्पणी को एक उत्तर के रूप में प्रस्तुत कर रहा हूं, क्योंकि यह मेरे लिए यहां सबसे अच्छा जवाब है।
sed 's/^/[ERROR] /' cmd
awk
एक लाइनर अच्छा पर्याप्त है, लेकिन मुझे लगता है कि और अधिक लोगों के साथ परिचित हैं sed
की तुलना में awk
। बैश स्क्रिप्ट जो करती है उसके लिए अच्छा है, लेकिन ऐसा लगता है कि यह एक सवाल का जवाब दे रहा है जो नहीं पूछा गया था।
sed X cmd
पढ़ता है cmd
और इसे निष्पादित नहीं करता है। या तो cmd | sed 's/^/[ERROR] /'
या sed 's/^/[ERROR] /' <(cmd)
या cmd > >(sed 's/^/[ERROR] /')
। लेकिन बाद वाले सावधान रहें। यह आप में से वापसी मान का उपयोग करने की अनुमति देता है यहां तक कि , पृष्ठभूमि में चलाता है, तो यह संभावना है कि आप उत्पादन को देखने के बाद समाप्त हो गया cmd। एक फ़ाइल में प्रवेश करने के लिए अच्छा है, यद्यपि। और ध्यान दें कि शायद इससे तेज है । cmd
sed
awk
sed
alias lpad="sed 's/^/ /'"
। ERROR के बजाय मैं 4 प्रमुख स्थान सम्मिलित करता हूं। अब, जादू चाल के लिए: ls | lpad | pbcopy
4 स्थानों जो यह निशान के रूप में साथ ls उत्पादन पहले जोड़ें जाएगा Markdown के लिए कोड , जिसका अर्थ है कि आप क्लिपबोर्ड (पेस्ट pbcopy यह पकड़ लेता है, Macs पर) सीधे StackOverflow या किसी अन्य markdown संदर्भ में। नहीं किया जा सका awk जवाब (1 कोशिश में) तो यह एक जीत। जबकि पढ़ने समाधान भी उर्फ करने योग्य है, लेकिन मैं यह पाते हैं sed अधिक अर्थपूर्ण। alias
मैंने कुछ स्पीड टेस्ट करने के लिए GitHub रिपॉजिटरी बनाई ।
परिणाम है:
awk
सबसे तेज है। sed
थोड़ा धीमा है और perl
ज्यादा धीमा नहीं है sed
। जाहिरा तौर पर, वे सभी टेक्स्ट प्रोसेसिंग के लिए अत्यधिक अनुकूलित भाषा हैं।ksh
स्क्रिप्ट ( shcomp
) के रूप में चलाना और भी अधिक प्रसंस्करण समय बचा सकता है। इसके विपरीत, bash
संकलित ksh
लिपियों की तुलना में मृत धीमी है ।awk
लगता है कि यह प्रयास के लायक नहीं है।इसके विपरीत python
, मृत धीमी गति से है, लेकिन मैंने एक संकलित मामले का परीक्षण नहीं किया है, क्योंकि यह आमतौर पर ऐसे स्क्रिप्टिंग मामले में आप क्या करेंगे।
निम्नलिखित प्रकारों का परीक्षण किया जाता है:
while read line; do echo "[TEST] $line"; done
while read -r line; do echo "[TEST] $line"; done
while read -r line; do echo "[TEST]" $line; done
while read -r line; do echo "[TEST]" "$line"; done
sed 's/^/[TEST] /'
awk '{ print "[TEST] " $0 }'
awk -vT="[TEST] " '{ print T $0 }'
awk -vT="[TEST]" '{ print T " " $0 }'
awk -vT="[TEST]" 'BEGIN { T=T " "; } { print T $0 }'
T="[TEST] " awk '{ print ENVIRON["T"] $0 }'
T="[TEST]" awk '{ print ENVIRON["T"] " " $0 }'
T="[TEST]" awk 'BEGIN { T=ENVIRON["T"] " " } { print T $0 }'
perl -ne 'print "[TEST] $_"'
मेरे एक टूल के दो बाइनरी वेरिएंट (यह गति के लिए अनुकूलित नहीं है, हालांकि):
./unbuffered.dynamic -cp'[TEST] ' -q ''
./unbuffered.static -cp'[TEST] ' -q ''
अजगर बफर्ड:
python -uSc 'import sys
for line in sys.stdin: print "[TEST]",line,'
और अजगर अप्रभावित:
python -uSc 'import sys
while 1:
line = sys.stdin.readline()
if not line: break
print "[TEST]",line,'
awk -v T="[TEST %Y%m%d-%H%M%S] " '{ print strftime(T) $0 }'
एक टाइमस्टैम्प उत्पादन करने के लिए
मैं एक ऐसा उपाय चाहता था, जो stdout और stderr को संभाले, इसलिए मैंने prepend.sh
इसे लिखा और अपने रास्ते में रखा:
#!/bin/bash
prepend_lines(){
local prepended=$1
while read line; do
echo "$prepended" "$line"
done
}
tag=$1
shift
"$@" > >(prepend_lines "$tag") 2> >(prepend_lines "$tag" 1>&2)
अब मैं सिर्फ prepend.sh "[ERROR]" cmd ...
"[ERROR]" को cmd
प्री- ऑफ कर सकता हूं , जिसके आउटपुट में , और अभी भी स्टडर और स्टाउट अलग है।
>(
उप-भागों के साथ कुछ चल रहा था जो मैं काफी हल नहीं कर सकता था। ऐसा लग रहा था कि स्क्रिप्ट पूरी हो रही है, और प्रॉम्प्ट टर्मिनल पर पहुंचने के बाद प्रॉम्प्ट वापस आ गया जो थोड़ा गड़बड़ था। मैं आखिरकार यहां जवाब के साथ आया हूं stackoverflow.com/a/25948606/409638