फ़ाइल को bash स्क्रिप्ट के माध्यम से संपादित करें


12

मैं बैश स्क्रिप्टिंग में एक शुरुआत कर रहा हूं। मैं स्वचालित रूप से अपने लिनक्स बॉक्स पर स्थापित और कॉन्फ़िगर सामान को स्थापित करने के लिए एक बैश स्क्रिप्ट बनाना चाहता हूं।

मान लीजिए मैं संपादित करना चाहता हूं

/etc/yum.repos.d/epel.repo

बैश स्क्रिप्ट द्वारा

जो मैं करना चाहता हूं वह इस प्रकार है

  1. फ़ाइल खोलें /etc/yum.repos.d/epel.repo
  2. [एपेल] अनुभाग खोजें
  3. एक लाइन प्राथमिकता = 10 को लाइन से सक्षम करने के बाद = एपेल सेक्शन में 1 जोड़ें

पहले भाग के लिए मैंने जोड़ा

yum install nano
nano /etc/yum.repos.d/epel.repo

मेरा प्रश्न है कि नैनो का उपयोग करके बश लिपि के साथ 2 और तीसरा भाग कैसे करें (यदि संभव हो तो, यदि संभव न हो तो मुझे मेरे साथ दिखाए)

इसके अलावा कुछ बिंदुओं पर मुझे उदाहरण के लिए फ़ाइलों में चर को संशोधित करना होगा

  1. enable = 0 को enable करने के लिए = 1
  2. परीक्षण = "1" से परीक्षण = "0"
  3. एक पंक्ति में पाठ जोड़ें। फ़ंक्शन = फ़ंक्शन के लिए = "text1", "text2"
  4. एक फ़ाइल में कुछ पाठ जोड़ें और इसे सहेजें (नैनो के साथ)

मुझे इसकी मांग पता है, लेकिन मुझे एक दोस्त के लिए इसे बनाने की आवश्यकता है जो सर्वर प्रबंधन में noob है। दुर्भाग्य से, मेरे पास परीक्षा से शुरू होने के रूप में bash scripting का अध्ययन करने का समय नहीं है। मैं पटकथा लिखने के लिए अपने उदाहरणों का उपयोग करूंगा।


दोस्तों सभी उत्तरों के लिए धन्यवाद, मैंने अधिकांश बैश स्क्रिप्ट को सफलतापूर्वक किया है

हालाँकि, मुझे एक और समस्या है कि मान लें कि मैं nginx.conf को संशोधित करना चाहता हूँ sed का उपयोग करते हुए हम कार्यकर्ता_प्रोसेस के साथ व्यवहार करेंगे।
अब मैं निम्नलिखित के लिए sed का उपयोग करना चाहता हूं। उस संदर्भ में पहली घटना को पूरा करें worker_processes और पाठ को प्रतिस्थापित करेंworker_processes 4;

विशेष नोट यहां: यह केवल एक उदाहरण है। ऐसा हो सकता है कि conf में कार्यकर्ता_प्रोसेस 1 हो; । यह कठिन हिस्सा है। मुझे एक sed कमांड चाहिए जो शब्द कार्यकर्ता_प्रोसेस के FIRST wHOLE मैच केस को ढूंढती है , टेक्स्ट की लाइन हटाएं जहां शब्द पाया जाता है और worker_processes 4;वहां पेस्ट करें और फिर फाइल सेव करें। यह सबसे विश्वसनीय तरीका है, हालांकि मैं फ़ाइलों को संपादित करते समय (बिना किसी आत्मविश्वास के बिना जोखिम के संपादन करता हूं

एक अंतिम सुझाव मैंने sed -i / s / enable = 0 / enable = 1 / g '/etc/yum.repos.d/remi.repo का उपयोग किया, ताकि remi में [रेमी] अनुभाग के तहत सक्षम = 0 सक्षम किया जा सके .repo। जब भी मुझे लगता है कि यह उस फ़ाइल में सभी सक्षम = 0 को संशोधित कर सकता है, जो सर्वर को मिटा देगा। कोई भी बेहतर कोड सुझा सकता है।


एक और सामान जो मुझे निश्चित नहीं है: पीआई एक फाइल को संपादित करना चाहता है जिसमें यह टेक्स्ट टेस्टिंग = "0" के रूप में है (हां इसमें उद्धरण हैं और मुझे इसे रखने की आवश्यकता है) इसे परीक्षण = "0" से परीक्षण = " 1 "(उद्धरण के साथ)

इसके अलावा, मुझे फ़ाइल के अंत में उद्धरण के साथ कुछ पाठ जोड़ने की आवश्यकता है जैसे कि "थैंक्स क्वांटा" (उद्धरण के साथ) जैसे php के लिए आप एको को उद्धरणों के साथ डालते हैं, यह नहीं जानते कि यह कैसे किया जाता है

एक और बात
मुझे एक लाइन को एक संशोधित करने की आवश्यकता है, लेकिन मुझे याद नहीं है कि प्रतिस्थापित करने के लिए संपूर्ण पाठ क्या है

जैसे इसकी सुन = कुछ; , मैं इसे सुनने के लिए संशोधित करना चाहता हूं = /tmp/php5-fpm.sock;

क्वांटा के लिए बड़े अंगूठे

भयानक समर्थन दोस्तों के लिए धन्यवाद

जवाबों:


18
sed '/enabled=1/a\priority=10' /etc/yum.repos.d/epel.repo

-iयदि आप चाहें तो इन-प्लेस संपादन विकल्प ( ) निर्दिष्ट करें ( .bakपहले एक्सटेंशन के साथ बैकअप बनाता है ):

sed -i.bak '/enabled=1/a\priority=10' /etc/yum.repos.d/epel.repo

अब मैं निम्नलिखित करने के लिए sed का उपयोग करना चाहता हूं। कार्यकर्ता के एफआरएसटी की घटना को उस संदर्भ में बताएं और टेक्स्ट को कार्यकर्ता_प्रोसेस 4 के साथ बदलें;

sed '0,/worker_processes [0-9]*;/s//worker_processes 4;/' /etc/nginx/nginx.conf

एक अंतिम सुझाव, जिसे मैं अनुभाग के अंतर्गत sed -i 's/enabled=0/enabled=1/g' /etc/yum.repos.d/remi.repoपरिवर्तित enabled=0करता था । हालाँकि, मुझे लगता है कि यह उस फ़ाइल में सभी को संशोधित कर सकता है , जो सर्वर को मिटा देगा। कोई भी बेहतर कोड सुझा सकता हैenabled=1[remi]remi.repoenabled=0

यहाँ आप के लिए:

sed '/\[remi\]/,/enabled=0/ { s/enabled=0/enabled=1/ }' remi.repo

एक और सामान जो मुझे निश्चित नहीं है: पीआई एक फाइल को संपादित करना चाहता है जिसमें यह टेक्स्ट टेस्टिंग = "0" के रूप में है (हां इसमें उद्धरण हैं और मुझे इसे रखने की आवश्यकता है) इसे परीक्षण = "0" से परीक्षण = " 1 "(उद्धरण के साथ)

sed 's/Testing = "0"/Testing = "1"/g'

इसके अलावा, मुझे फ़ाइल के अंत में उद्धरण के साथ कुछ पाठ जोड़ने की आवश्यकता है जैसे कि "थैंक्स क्वांटा" (उद्धरण के साथ) जैसे php के लिए आप एको को उद्धरणों के साथ डालते हैं, यह नहीं जानते कि यह कैसे किया जाता है

sed '$a"Werulz, you are welcome"\'

एक और बात मुझे एक लाइन को एक संशोधित करने की आवश्यकता है, लेकिन मुझे याद नहीं है कि प्रतिस्थापित करने के लिए संपूर्ण पाठ क्या है

जैसे इसकी सुन = कुछ; , मैं इसे सुनने के लिए संशोधित करना चाहता हूं = /tmp/php5-fpm.sock;

sed 's/listen = .*/listen = \/tmp\/php5-fpm.sock;/'

'sed' /
enable

@Erulz: बस उस फ़ाइल से जांच करें जो कोई फर्क नहीं पड़ता या epel.repo की सामग्री को होम डायरेक्टरी की किसी फ़ाइल में कॉपी करें या रूट / सुपरसुअर विशेषाधिकारों के बिना वहां चलाने का प्रयास करें।
एरिक I

-iएक नहीं है मानक विकल्प के लिए sededहालाँकि, सिंटैक्स के साथ फ़ाइलों को संपादित करने के लिए एक मानक-अनुरूप तरीका प्रदान करता है जो कि sed के समान है।
कोजीरो

मैंने आपसे एक और सुझाव पूछने के लिए अपनी पहली पोस्ट अपडेट की है। समर्थन के लिए बहुत बहुत धन्यवाद।
वेरुलज़

मैंने पोस्ट को फिर से अपडेट किया ...... इतने सारे प्रश्न पूछने के लिए क्षमा करें। मामले की यू जरूरत में आपके साथ स्क्रिप्ट साझा करेंगे
वेरुलज़

12

जैसा ptman कहा, Augeas का उपयोग करने से बचा सकता है sed/ awk:

$ augtool -s set /files/etc/yum.repos.d/epel.repo/epel/priority 10

epel10 को रिपॉजिटरी की प्राथमिकता निर्धारित करेगा । यदि priorityकुंजी पहले से मौजूद है, तो वह अपना मूल्य निर्धारित करेगा, अन्यथा यह priorityअनुभाग में अंतिम प्रविष्टि के बाद एक प्रविष्टि जोड़ देगा ।

वही अन्य मूल्यों के लिए जाता है जिन्हें आप संशोधित करना चाहते हैं।

यदि आप कई मानों को संशोधित करना चाहते हैं, तो आप augtoolएक दुभाषिया के रूप में भी उपयोग कर सकते हैं :

$ cat epel.augtool
#!/usr/bin/augtool -sf

# Make a variable
defvar epel /files/etc/yum.repos.d/epel.repo/epel

# Set values
set $epel/enable 1
set $epel/priority 10
set $epel/Testing 0
$ chmod +x epel.augtool
$ ./epel.augtool
Saved 1 file(s)

यदि आप इसे अपने बैश स्क्रिप्ट में रखना चाहते हैं, तो आप कमांड को पाइप में डाल सकते हैं augtool:

cat <<EOF | augtool
# Make a variable
defvar epel /files/etc/yum.repos.d/epel.repo/epel

# Set values
set $epel/enable 1
set $epel/priority 10
set $epel/Testing 0
save
EOF

man augtoolअधिक विकल्पों के लिए देखें ।

Augeas vs sed/ का उपयोग करने के लिए कई लाभ हैं awk:

  • Augeas में फ़ाइल सिंटैक्स (इस मामले में, yum.repoसिंटैक्स) के बारे में जानने वाले पार्सर होते हैं । यदि आपका रेगेक्स गलत है, तो आप फ़ाइल सिंटैक्स को तोड़ने का जोखिम नहीं लेंगे;
  • Augeas yum.repo पार्सर yum.repoअनुभागों के बारे में जानता है , इसलिए आप जानते हैं कि आप सही अनुभाग संपादित कर रहे हैं;
  • अगेता आलंकारिक होता है। यदि परिवर्तन किए जाने हैं तो यह केवल फ़ाइल में परिवर्तन करेगा। यदि सभी मान पहले से सेट हैं, तो यह फ़ाइल को संशोधित नहीं करेगा;
  • ऑगस में एक कठपुतली प्रदाता है, इसलिए आप इसे कठपुतली बुनियादी ढांचे में आसानी से स्वचालित कर सकते हैं;
  • यदि पैरामीटर अभी तक मौजूद नहीं हैं, तो Augeas उन्हें आपके लिए बनाएंगे। यदि अनुभाग अभी तक मौजूद नहीं है, तो उचित सिंटैक्स के साथ ऑगेस भी इसे बनाएगा।

उत्तर के लिए धन्यवाद ...... यह सुनिश्चित करने के लिए विचार करेगा .... क्या आप इसका उदाहरण दे सकते हैं कि इसे कैसे मेरे बैश स्क्रिप्ट के साथ उपयोग किया जा सकता है
Werulz

ठीक है, मेरा संपादन देखें।
ℝएफ़िंक

2

आप ऑगैस की जाँच भी कर सकते हैं , प्रोग्रामेटिक रूप से कॉन्फ़िगर करने वाली फाइल के लिए टूल। यह पपेट (एक विन्यास प्रबंधन प्रणाली) के साथ संयोजन में बहुत शक्तिशाली है , लेकिन इसका उपयोग स्वयं भी किया जा सकता है।


वह क्या है
लोल

2
ऑगेस / क्या करता है, और एक उदाहरण या दो को जोड़कर एक संक्षिप्त विवरण प्रदान करके आप इस उत्तर की गुणवत्ता में सुधार कर सकते हैं।
ThatGraemeGuy

मैंने एक नया प्रश्न लोगों को जोड़ा
वेरुलज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.