Linux-Shell (2)

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

Acho que você gosta

Origin blog.csdn.net/pipihan21/article/details/132592944
Recomendado
Clasificación