यदि आप चाहते हैं कि अंतिम 10 लाइनें:
tail myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
लेकिन जीएनयू के साथ xargs
, आप सीमांकक को नई रेखा के साथ सेट कर सकते हैं:
tail myFile.txt | xargs -ri -d '\n' myCmd {} arg1 arg2
(के -0
लिए कम है -d '\0'
)।
आंशिक रूप से, आप भी हर चरित्र से बच सकते हैं:
tail myFile.txt | sed 's/./\\&/g' | xargs -I{} myCmd {} arg1 arg2
या प्रत्येक पंक्ति बोली:
tail myFile.txt | sed 's/"/"\\""/g;s/.*/"&"/' | xargs -I{} myCmd {} arg1 arg2
यदि आप चाहते हैं कि 10 अंतिम एनयूएल-सीमांकित रिकॉर्ड myFile.txt
(लेकिन फिर वह पाठ फ़ाइल नहीं होगी), तो आपको कॉल \n
करने \0
से पहले कन्वर्ट tail
करना होगा जिसका अर्थ है कि फ़ाइल को पूरी तरह से पढ़ना होगा:
tr '\n\0' '\0\n' < myFile.txt |
tail |
tr '\n\0' '\0\n' |
xargs -r0i myCmd {} arg1 arg2
संपादित करें (जब से आपने अपने प्रश्न में परिवर्तन किया tail
है tail -f
):
पिछले एक से ऊपर स्पष्ट रूप से समझ में नहीं आता है tail -f
।
xargs -d '\n'
एक काम करेंगे, लेकिन अन्य लोगों के लिए, आप एक बफरिंग समस्या होगा। में:
tail -f myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
tr
जब इसका टर्मिनल (यहां, एक पाइप) पर नहीं जाता है तो इसका आउटपुट बफ़र करता है। IE, यह तब तक कुछ भी नहीं लिखेगा जब तक कि इसे लिखने के लिए डेटा का एक बफर पूर्ण (8kiB जैसा कुछ) जमा न हो। जिसका अर्थ myCmd
बैचों में कहा जाएगा।
GNU या FreeBSD सिस्टम पर, आप कमांड के tr
साथ बफरिंग व्यवहार को बदल सकते हैं stdbuf
:
tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
xargs -r0i myCmd {} arg1 arg2