Handige Bash Command Line Tips en trucs Voorbeelden - Deel 4

  • Richard Poole
  • 0
  • 1606
  • 85
>

Voortbordurend op onze serie over nuttige Bash-opdrachtregel-tips en -trucs, zullen we in het artikel van vandaag alleen grepping onderzoeken wat je nodig hebt, en beginnen met een inleiding over pwd en hoe u het pad kunt ontdekken waarop een script is gestart.

In deze tutorial leer je:

  • Handige Bash-commandoregel-tips, trucs en methoden
  • Hoe u op een geavanceerde manier kunt communiceren met de Bash-opdrachtregel
  • Hoe u uw Bash-vaardigheden in het algemeen kunt aanscherpen en een meer bekwame Bash-gebruiker kunt worden
Handige Bash Command Line Tips en trucs Voorbeelden - Deel 4

Gebruikte softwarevereisten en -conventies

Softwarevereisten en Linux Command Line-conventies
Categorie Vereisten, conventies of gebruikte softwareversie
Systeem Linux-distributie-onafhankelijk
Software Bash-opdrachtregel, op Linux gebaseerd systeem
Andere Elk hulpprogramma dat niet standaard in de Bash-shell is opgenomen, kan worden geïnstalleerd met sudo apt-get install utility-name (of yum installeren voor op RedHat gebaseerde systemen)
Conventies # - vereist dat linux-commando's worden uitgevoerd met root-privileges, hetzij direct als rootgebruiker, hetzij door gebruik van sudo opdracht
$ - vereist dat linux-commando's worden uitgevoerd als een gewone niet-geprivilegieerde gebruiker

Voorbeeld 1: pad werkmap? Of niet?

We zijn misschien gewend om te bellen pwd op de opdrachtregel om ons de naam van onze huidige map te vertellen:

$ pwd / home / roel / workspace 

Maar als we de directory willen krijgen van waaruit een script is gestart, werkt het gebruik van deze variabele uit een script ook op dezelfde manier?

$ cat test_pwd.sh #! / bin / bash MY_PATH1 = "$ PWD" echo "$ MY_PATH1" MY_PATH2 = "$ (pwd)" echo "$ MY_PATH2" 

We zullen twee manieren gebruiken om het pad op te halen: we zoeken (voor de eerste MY_PATH1 opdracht) bij de PWD (OS-niveau) automatisch vooraf ingestelde variabele, en in het tweede geval (voor het tweede MY_PATH2 opdracht) die we uitvoeren pwd in een subshell ($ (...)) en wijs het toe aan MY_PATH2. Laten we hetzelfde uitvoeren:

$ ./test_pwd.sh / home / roel / workspace / home / roel / workspace 

Ziet er goed uit, toch? Ja, misschien, maar zodra we naar een andere directory gaan en het script aanroepen door de volledige of relatieve padnaam te gebruiken, de PWD variabele (of de pwd command) in het script retourneert de map waarin we ons bevonden toen het script werd gestart. Laten we dit verifiëren:

$ mkdir test $ cd test $… /test_pwd.sh / home / roel / workspace / test / home / roel / workspace / test 

Wat we hier kunnen zien, is dat pwd (of de $ PWD variabele) retourneert altijd het actuele huidige pad.

Dit kan een probleem zijn: we willen misschien een subscript starten of een bestand openen vanuit dezelfde map (of een submap daarvan) als die waarin het script zich bevond. Dit is vaak het geval voor complexere Bash-scripts die oproep meerdere abonnementen en / of data- en configuratiebestanden.

Dus wat is een uniforme manier om het pad van waaruit het script is gestart?

Men kan overwegen om de mapnaam "$ 0" opdracht:

$ cat test2.sh #! / bin / bash echo "$ 0" mapnaam "$ 0" 

Dirname geeft de - relatieve - directorynaam van elke optie die eraan wordt doorgegeven, en in dit geval is dat het geval $ 0 - een speciale variabele die wordt ingesteld wanneer een script begint met de naam van het script zoals het is gestart. Laten we het testen:

$ ./test2.sh ./test2.sh. $ cd test $… /test2.sh ... /test2.sh ... 

Beter, denk ik, en het kan een beetje helpen (voornamelijk om een ​​idee te krijgen), maar het levert ons nog steeds geen volledig gekwalificeerde padnaam op. Hiervoor kunnen we een dubbele subshell wrapper gebruiken dirname in combinatie met een daadwerkelijk volledig gekwalificeerd pad verkregen uit een pwd uitvoering:

$ cat make_it_work.sh #! / bin / bash MY_PATH = "$ (cd" $ (dirname "$ 0") "&& pwd)" echo "$ MY_PATH" 

Eens kijken of het werkt:

$ ./make_it_work.sh / home / roel / workspace 

Tot zover goed, maar werkt het als je het vanuit een submap uitvoert?

$ cd test && pwd / home / roel / workspace / test $… /make_it_work.sh / home / roel / workspace $ /home/roel/workspace/make_it_work.sh / home / roel / workspace 

Ja!

We veranderen eerst in test en controleer of we in de test directory, als die directory (CD) commando succesvol was (zoals geïnstrueerd door &&).

In beide gevallen - of het op een relatieve manier wordt aangeroepen (… /), of met een volledig gekwalificeerde padnaam (/ home / roel / werkruimte /), het resultaat is dat we de directory zien van waaruit het script is gestart (/ home / roel / werkruimte /) en niet de daadwerkelijke huidige werkdirectory, of pwd (/ home / roel / workspace / test).

Samenvattend kunt u de MY_PATH = "$ (cd" $ (mapnaam "$ 0") "&& pwd)" one-liner-script om de correcte, volledig gekwalificeerde directorynaam te verkrijgen vanuit uw scripts. Hierna zal het gebruik van een relatieve toevoeging goed werken. U kunt bijvoorbeeld $ MY_PATH /include/mysubscript.sh en zelfs $ MY_PATH /… /one_dir_up_file.txt enzovoort.

Voorbeeld 2: alleen grijpen wat u nodig heeft

Heb je ooit gebruikt grep? Grep is een veelzijdig Bash-opdrachtregelprogramma waarmee u eenvoudig tekst uit een bestand kunt selecteren. Meestal wordt het als volgt gebruikt:

$ cat test lijn 1 mijn lijn lijn 2 uw lijnen lijn 3 onze lijn $ grep 'lijn 2' test lijn 2 uw lijnen 


We hebben een invoerbestand met 3 regels en we zoeken naar een specifieke test (lijn 2) in dat bestand. Maar hoe zit het als u alleen de lijnen wilt die het veelvoud hebben van lijn (d.w.z. lijnen) vermeld in hen? En wat als u alleen het woord ervoor wilde hebben, inclusief de lijnen beetje, maar niet de werkelijke regel x output?

In dat geval kunnen we alleen grepen voor wat we nodig hebben met behulp van de -O ('alleen') optie om te grepen:

$ grep -o 'lijnen' test lijnen $ grep -o '\ w \ + lijnen' test uw lijnen 

Bingo! We grepen eerst alleen voor het woord 'lijnen', dat werd gevonden. We hebben dat vervolgens voorafgegaan door een spatie en een reguliere expressie die in pseudo-tekst zegt: vind een woordgrens (\ w), minstens één keer en zo vaak als van toepassing is (\+) gevolgd door een spatie. Het resultaat is dat uw (die twee woordgrenzen heeft; een begin en een einde) is inbegrepen. lijn 2 is niet inbegrepen. Hoewel het woordgrenzen heeft, is er geen achtervoegsel van lijnen aan die.

Als je meer wilt weten over reguliere expressies in Bash, ga dan naar Bash Regexps voor beginners met voorbeelden, Advanced Bash Regex met voorbeelden en misschien vind je ook de semi-gerelateerde Python Regular Expressions met voorbeelden leuk..

Gevolgtrekking

In dit artikel hebben we onderzocht pwd en keken hoe te gebruiken pwd vanuit een script in combinatie met dirname om het volledig gekwalificeerde directorypad op te halen van waaruit het script is gestart, op een manier die altijd zal werken. We hebben ook gekeken naar grepping alleen wat we nodig hebben met behulp van de -O optie en, in dit geval, reguliere expressie om overeen te komen met woordgrenzen.

Laat een reactie achter met je beste tips en trucs voor de Bash-opdrachtregel!




Niemand heeft nog op dit artikel gereageerd.

Een verzameling nuttige informatie over het Linux-besturingssysteem en nieuwe technologieën
Nieuwe artikelen, praktische tips, gedetailleerde recensies en handleidingen. Voel je thuis in de wereld van het Linux-besturingssysteem