Linux-Shell
Funktion
Systemfunktion
Basisname
-
Grundgrammatik
Basisname [String/Pfadname] [Suffix]Funktionsbeschreibung: Der Befehl basename löscht alle Präfixe einschließlich des letzten Zeichens ('/') und zeigt dann die Zeichenfolge an
Basisname kann als Dateiname in der Pfaddatei verstanden werden
Optionen:
Suffix ist das Suffix. Wenn Suffix angegeben ist, entfernt Basisname das Suffix aus dem Pfadnamen oder der Zeichenfolge.
-
Fallpraxis
Fangen Sie den Dateinamen des Pfads /home/guozihan/banzhang.txt ab
[guozihan@hadoop100 program]$ basename /home/guozihan/banzhang.txt banzhang.txt [guozihan@hadoop100 program]$ basename /home/guozihan/banzhang.txt .txt banzhang
Verzeichnisname
-
Grundgrammatik
Absoluter Pfad der Dirname-DateiFunktionsbeschreibung: Entfernen Sie den Dateinamen (Nicht-Verzeichnisteil) aus dem angegebenen Dateinamen, der einen absoluten Pfad enthält, und geben Sie dann den verbleibenden Pfad (Verzeichnisteil) zurück.
dirname kann als absoluter Pfadname des Dateipfads verstanden werden
-
Fallpraxis
Rufen Sie den Pfad der banzhang.txt-Datei ab
[guozihan@hadoop100 program]$ dirname /home/guozihan/banzhang.txt /home/guozihan
Benutzerdefinierte Funktion
-
Grundgrammatik
[ function ] funname[()] { Action; [return int;] }
-
Erfahrungsfähigkeiten
- Die Funktion muss vor dem Funktionsaufruf deklariert werden und das Shell-Skript wird Zeile für Zeile ausgeführt. Es wird nicht wie andere Sprachen zuerst kompiliert.
- Der Rückgabewert der Funktion kann nur über die Systemvariable $? abgerufen werden. Sie können Folgendes hinzufügen: return to display. Andernfalls wird das Ergebnis des letzten Befehls als Rückgabewert verwendet. return gefolgt vom Wert n(0-255)
-
Fallpraxis
Berechnen Sie die Summe zweier Eingabeparameter
[guozihan@hadoop100 program]$ touch fun.sh [guozihan@hadoop100 program]$ vim fun.sh
#!/bin/bash function sum() { s=0 s=$[$1+$2] echo "$s" } read -p "Please input the number1: " n1; read -p "Please input the number2: " n2; sum $n1 $n2;
[guozihan@hadoop100 program]$ chmod 777 fun.sh [guozihan@hadoop100 program]$ ./fun.sh Please input the number1:2 Please input the number2:5 7
Erste Schritte mit regulären Ausdrücken
Reguläre Ausdrücke verwenden eine einzelne Zeichenfolge, um eine Reihe von Zeichenfolgen zu beschreiben und abzugleichen, die einer bestimmten Grammatikregel entsprechen.. In vielen Texteditoren werden häufig reguläre Ausdrücke verwendet, um Text abzurufen und zu ersetzen, der einem bestimmten Muster entspricht.Unter Linux unterstützen alle Textverarbeitungstools wie grep, sed und awk den Mustervergleich durch reguläre Ausdrücke.。
reguläres Spiel
Ein regulärer Ausdruck, der keine Sonderzeichen enthält, stimmt mit sich selbst überein
[guozihan@hadoop100 program]$ cat /etc/passwd | grep guozihan
guozihan:x:1000:1000:Guozihan:/home/guozihan:/bin/bash
stimmt mit allen Zeilen überein, die guozihan enthalten
Häufig verwendete Sonderzeichen
-
Sonderzeichen: ^
^ entspricht dem Anfang einer Zeile
[guozihan@hadoop100 program]$ cat /etc/passwd | grep ^a adm:x:3:4:adm:/var/adm:/sbin/nologin abrt:x:173:173::/etc/abrt:/sbin/nologin avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
findet alle Zeilen, die mit a beginnen
-
Sonderzeichen: $
$ entspricht dem Ende einer Zeile
[guozihan@hadoop100 program]$ cat /etc/passwd | grep t$ halt:x:7:0:halt:/sbin:/sbin/halt
findet alle Zeilen, die mit t enden
-
Spezielle Charaktere:.
. entspricht jedem Zeichen
[guozihan@hadoop100 program]$ cat /etc/passwd | grep r..t root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
Entspricht allen Zeilen, die rabt, rbbt, rxdt, root usw. enthalten.
-
Spezielle Charaktere:*
* wird nicht alleine verwendet. Es wird zusammen mit dem vorherigen Zeichen verwendet, um das vorherige Zeichen 0-mal oder öfter zu finden.
[guozihan@hadoop100 program]$ cat /etc/passwd | grep ro*t root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin abrt:x:173:173::/etc/abrt:/sbin/nologin rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
Passt zu allen Zeilen wie rt, rot, root, rooot, roooot usw.
-
Zeichenintervall (eckige Klammern): [ ]
[ ] bedeutet Übereinstimmung mit einem Zeichen innerhalb eines bestimmten Bereichs
[6,8]------Match 6 oder 8
[0-9]------passen Sie eine Zahl von 0-9 an
[0-9]*------entspricht einer beliebigen Länge einer numerischen Zeichenfolge
[az]------entspricht einem Zeichen zwischen az
[az]* ------entspricht einer beliebigen Länge einer alphabetischen Zeichenfolge
[ac, ef] – entspricht jedem Zeichen zwischen ac und ef
[guozihan@hadoop100 program]$ cat /etc/passwd | grep r[a,b,c]*t operator:x:11:0:operator:/root:/sbin/nologin abrt:x:173:173::/etc/abrt:/sbin/nologin rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
Entspricht allen Zeilen wie rt, rat, rbt, rabt, rbact, rabccbaaacbt usw.
-
Spezielle Charaktere:\
\ steht für Escape und wird nicht alleine verwendet. Da alle Sonderzeichen ihre eigenen spezifischen Übereinstimmungsmuster haben, werden wir auf Schwierigkeiten stoßen, wenn wir ein Sonderzeichen selbst abgleichen möchten (z. B. möchte ich alle Zeilen finden, die „$“ enthalten). zu diesem ZeitpunktWir müssen Escape-Zeichen und Sonderzeichen zusammen verwenden, um die Sonderzeichen selbst darzustellen
[guozihan@hadoop100 program]$ cat /etc/passwd | grep 'a\$b'
stimmt mit allen Zeilen überein, die a$b enthalten. Beachten Sie, dass Sie den Ausdruck in einfache Anführungszeichen setzen müssen
Textverarbeitungswerkzeuge
schneiden
Die Aufgabe des Schneidens besteht konkret darin, zu „schneiden“.Verantwortlich für das Ausschneiden der Daten in der Datei. SchnittbefehlSchneiden Sie Bytes, Zeichen und Felder aus jeder Zeile der Datei aus und geben Sie diese Bytes, Zeichen und Felder aus。
-
Grundlegende Verwendung
Dateiname [Optionsparameter] ausschneiden
Hinweis: Das Standardtrennzeichen ist Tab
-
Beschreibung der Optionsparameter
-FSpaltennummer, welche Spalte extrahiert werden soll +
-DTrennzeichen, Spalten gemäß dem angegebenen Trennzeichen aufteilen, der Standardwert ist das Tabulatorzeichen „\t“.
-CFügen Sie nach dem Schneiden nach Zeichen n hinzu, um anzugeben, welche Spalte verwendet werden soll, z. B. -c 1
-
Fallpraxis
Datenaufbereitung
[guozihan@hadoop100 program]$ touch cut.txt [guozihan@hadoop100 program]$ vim cut.txt
dong shen guan zhen wo wo lai lai le le
Schneiden Sie die erste Spalte von cut.txt aus
[guozihan@hadoop100 program]$ cut -d " " -f 1 cut.txt dong guan wo lai le
Schneiden Sie die zweite und dritte Spalte von cut.txt aus
[guozihan@hadoop100 program]$ cut -d " " -f 2,3 cut.txt shen zhen wo lai le
Schneiden Sie Guan in der Datei „cut.txt“ aus
[guozihan@hadoop100 program]$ cat cut.txt | grep guan | cut -d " " -f 1 guan
Wählen Sie den Systemvariablenwert PATH aus. Alle Pfade beginnen mit dem zweiten „:“
[guozihan@hadoop100 program]$ echo $PATH /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/guozihan/.local/bin:/home/guozihan/bin [guozihan@hadoop100 program]$ echo $PATH | cut -d ":" -f 3- /usr/local/sbin:/usr/sbin:/home/guozihan/.local/bin:/home/guozihan/bin
Nach dem Ausschneiden von ifconfig wird die IP-Adresse gedruckt
[guozihan@hadoop100 program]$ ifconfig ens33 | grep netmask | cut -d " " -f 10 192.168.182.100
awk
Ein leistungsstarkes Textanalysetool,Lesen Sie die Datei Zeile für Zeile, teilen Sie jede Zeile mit Leerzeichen als Standardtrennzeichen auf und analysieren und verarbeiten Sie dann die ausgeschnittenen Teile.。
-
Grundlegende Verwendung
awk [Optionsparameter] '/pattern1/{action1} /pattern2/{action2}…' Dateiname
Muster: Gibt an, wonach awk in den Daten sucht, nämlich das passende Muster.
Aktion: Eine Reihe von Befehlen, die ausgeführt werden, wenn passender Inhalt gefunden wird
-
Beschreibung der Optionsparameter
-FGeben Sie das Trennzeichen für die Eingabedatei an
-vWeisen Sie einer benutzerdefinierten Variablen einen Wert zu
-
Beachten
Nur Zeilen, die mit dem Muster übereinstimmen, führen die Aktion aus.
[atguigu@hadoop101 shells]$ awk -F : 'BEGIN{print "user, shell"} {print $1","$7} END{print "dahaige,/bin/zuishuai"}' passwd user, shell root,/bin/bash bin,/sbin/nologin 。。。 atguigu,/bin/bash dahaige,/bin/zuishuai
BEGIN wird ausgeführt, bevor alle Datenzeilen gelesen wurden; END wird ausgeführt, nachdem alle Daten ausgeführt wurden.
-
awks integrierte Variablen
DATEINAMEDateiname
NR Anzahl der gelesenen Datensätze (Zeilennummer)
NF Die Anzahl der Domänen im Browserdatensatz (Nach dem Schneiden die Anzahl der Spalten)
-
Praxisbeispiele
Fragen Sie die Zeilennummer der Leerzeile im Ausgabeergebnis des ifconfig-Befehls ab
[guozihan@hadoop100 program]$ ifconfig | awk '/^$/{print NR}' 9 18 25
IP abschneiden
[guozihan@hadoop100 program]$ ifconfig ens33 | awk '/netmask/ {print $2}' 192.168.182.100
Umfangreiche Anwendungsfälle
Archivdatei
In tatsächlichen Produktionsanwendungen müssen wichtige Daten häufig archiviert und gesichert werden.
Anforderungen: Implementieren Sie ein Skript, das täglich Sicherungen eines bestimmten Verzeichnisses archiviert, geben Sie einen Verzeichnisnamen ein (ohne / am Ende), archivieren und speichern Sie alle Dateien im Verzeichnis nach Tag, hängen Sie das Archivierungsdatum an den Namen der Archivdatei an und platzieren Sie sie es im /root/-Archiv.
Hier kommt der Archivbefehl zum Einsatz: tar
Sie können anschließend die Option -c hinzufügen, um die Archivierung anzugeben, und die Option -z, um die gleichzeitige Komprimierung anzuzeigen. Das resultierende Dateisuffix ist .tar.gz.
#!/bin/bash
# 首先判断输入参数个数是否为 1
if [ $# -ne 1 ]
then
echo "参数个数错误!应该输入一个参数,作为归档目录名"
exit
fi
# 从参数中获取目录名称
# 判断目录是否存在
if [ -d $1 ]
then
echo
else
echo
echo "目录不存在!"
echo
exit
fi
DIR_NAME=$(basename $1)
DIR_PATH=$(cd $(dirname $1); pwd)
# 获取当前日期
DATE=$(date +%y%m%d)
# 定义生成的归档文件名称
FILE=archive_${DIR_NAME}_$DATE.tar.gz
DEST=/root/archive/$FILE
# 开始归档目录文件
echo "开始归档..."
echo
tar -czf $DEST $DIR_PATH/$DIR_NAME
if [ $? -eq 0 ]
then
echo
echo "归档成功!"
echo "归档文件为:$DEST"
echo
else
echo "归档出现问题!"
echo
fi
exit
Eine Nachricht schicken
Wir können die mit Linux gelieferten Nachrichten- und Schreibtools verwenden, um Nachrichten an andere Benutzer zu senden
Anforderung: Implementieren Sie ein Skript, um einem Benutzer schnell eine Nachricht zu senden. Geben Sie als ersten Parameter den Benutzernamen ein, direkt gefolgt von der zu sendenden Nachricht. Das Skript muss erkennen, ob der Benutzer am System angemeldet ist, ob die Nachrichtenfunktion aktiviert ist und ob die aktuell gesendete Nachricht leer ist.
#!/bin/bash
login_user=$(who | grep -i -m 1 $1 | awk '{print $1}')
# [ -z $变量] :判断变量是否为空
if [ -z $login_user ]
then
echo "$1 不在线!"
echo "脚本退出.."
exit
fi
is_allowed=$(who -T | grep -i -m 1 $1 | awk '{print $2}')
# 查看用户是否开启消息功能
# 判is_allowed是否为+
if [ $is_allowed != "+" ]
then
echo "$1 没有开启消息功能"
echo "脚本退出.."
exit
fi
# 确认有消息发送
if [ -z $2 ]
then
echo "没有消息发出"
echo "脚本退出.."
exit
fi
# 从参数中获取要发送的消息
whole_msg=$(echo $* | cut -d " " -f 2- )
# 获取用户登录的终端
user_terminal=$(who | grep -i -m 1 $1 | awk '{print $2}')
# 写入要发送的数据
echo $whole_msg | write $login_user $user_terminal
# 确认发送结果
if [ $? != 0 ]
then
echo "发送失败!"
else
echo "发送成功!"
fi
exit