shell 學習筆記 LinuxShell腳本攻略(第2版)


1 注釋用#號;多條命令通過分號或回車來分隔
2 echo會自動換行,若不想換行,則加上-n參數,如 echo -n "nice to meet you"

grep 'test' d* 顯示所有以d開頭的文件中包含test的行。
scp sourecFile romoteUserName@remoteIp:remoteAddr 遠程拷貝
切換用戶:su -username
tail -f exmaple.log 這個命令會自動顯示新增內容,屏幕只顯示10行內容的(可設置)。
netstat -tln | grep 8080 查看端口8080的使用情況

或 netstat -antp  | grep 8080
查看指定進程打開的文件:lsof -p $pid 【lsof一般用來查看進程打開的文件:list open file】
遠程登錄:ssh userName@ip

echo后面的內容可以不帶引號,可以帶單引號,也可以帶雙引號

1 對於進程來說,其運行時的環境變量可以使用下面的命令來查看:cat /proc/$PID/environ
2 若輸出的結果連在一起了,說明結果之間由null字符(\0)分隔,為了每個結果占一行,可以進行替換操作,如:cat /proc/12501/environ | tr '\0' '\n'
3 注意, var = value不同於var=value。把var=value寫成var = value是一個常見的錯誤,但前者是賦值操作,后者則是相等操作。 
4 在變量名之前加上$前綴就可以打印出變量的內容 5 定義環境變量用export ;給已有環境變量追加值,也用export,如 export PATH="$PATH:/home/bin" 6 獲取變量值的長度 # :echo ${#haha}

整數運算:no1=4;no2=5

[alauda@ip-10-140-10-186 temp]$ let cc=no1+no2
[alauda@ip-10-140-10-186 temp]$ echo $cc
9
[alauda@ip-10-140-10-186 temp]$ zz=$[no1+no2]
[alauda@ip-10-140-10-186 temp]$ echo $zz
9

 文件描述符

echo "sdfsdf">bb  覆蓋式寫入,文件里原來的東西會被清空

echo  "what's wrong" >>bb  追加式寫入

============

定義數組:sdf=(11 22 33)   ----元素之間通過空格分隔

訪問所以成員:echo ${sdf[*]}

打印數組長度:echo ${#sdf[*]}

=========調試========

打印出所執行的每一行命令以及當前狀態:/bin/bash -x aa.sh

使用set -xset +x對腳本進行部分調試 :

#!/bin/bash 

sdf=1
echo $sdf
set -x if [ $sdf = 1 ]
then
    echo "nice to meet you"
    set +x else
    echo "not equal"
fi

=================函數

  6 #!/bin/bash
  7 myfun() ----定義函數 8 { 9     echo $@;
 10     echo $2;
 11     return 10;                                                                                                                    
 12 } 13 myfun "aa" "bb" ;   --調用函數
 14 echo $?   ---打印函數返回值

===============

從輸入中讀取n個字符並存入變量xx:read -n 3 xx

用特定的定界符作為輸入行的結束: read -d ";" xx

echo -n 'ni;hao;ma;' |xargs -d ';'
ni hao ma

=====================

將字符串用逗號分隔,逐個打印   IFS存放的是 定界符

aiya()
{
    echo $1;
    OLDIFS=$IFS; IFS=","; for item in $1;
    do
        echo item:$item;
    done
    IFS=$OLDIFS;
    echo "over over";
    }

aiya "ni,hai,hao,ma"

結果:

ni,hai,hao,ma
item:ni
item:hai
item:hao
item:ma
over over

================循環

 

 若在if后面放的不是命令,則要通過test或 [ ] 實現,如判斷變量是否有值、判斷是否相等,都需要[]

myfun()
{ 
        item=""
        if [ $item ]      --------[] 第一個方括號之后和第二個方括號之前必須加上一個空格 

then echo
"have" else echo "not have" fi }
輸出是 not have

 

aiya()
{
    echo $1;
    if  [ $1 == 21 ]
    then
        echo '11111';
    elif [ $1 == 2 ]
    then
        echo '22222'
    else
        echo '3333'
    fi

}
aiya 12 ;  ---調用

myfun()
{ 
    for item in $1;
    do
        echo $item
    done
    echo "ooooooooo"
}

 

==========條件語句=================

[ $1 == 1 ] && echo "success" 

 ===============

 添加行號:cat -n lines.txt

 忽略名字大小寫進行查找:find . -iname aa*

多條件查詢:find . \( -name "*.txt" -o -name "*.sh" \)

 用“!否定參數的含義 :find . ! -name "*.sh" 

只對當前目錄進行查找:find . -maxdepth 1 -name "*.txt"

-atime-mtime-ctime 的單位是天,- 表示小於, + 表示大於
-amin  -mmin  -cmin的單位是分鍾

刪除查找到的匹配文件:find . -name "*.txt" -delete

查找除zz目錄之外的所有文件:find . \( -path "*zz*" -prune \) -o \( -type f -print \)

find的常用參數:-name -path -maxdepth -type -mtime -size -delete

=====================

xargs擅長將標准輸入數據轉換成命令行參數

將多行文本轉換成單行文本:

將單行輸入轉換成多行輸出 

 

將cat的返回值逐一傳給sh腳本: cat bb | xargs -n 1  ./hanshu.sh 

cat bb | xargs -I {} ./hanshu.sh {}

將cat的返回值和其他參數按順序傳給sh腳本:

cat bb | xargs -I {} ./hanshu.sh -p {} -s   【-I {} 指定了替換字符串。對於每一個命令參數,字符串{}都會被從stdin讀取到的參數替換掉

只要我們把find的輸出作為xargs的輸入,就必須將 -print0find結合使用,以字符null'\0')來分隔輸出 ,從而統一定界符

find . -type f -name "*.txt" -print0 | xargs -0 rm -f

==============

tr只能通過stdin(標准輸入),而無法通過命令行參數來接受輸入

ls | tr set1 set2

如果兩個字符集的長度不相等,那么set2會不斷重復其最后一個字符,直到長度與set1相同。如果set2的長度大於set1,那么在set2中超出set1長度的那部分
字符則全部被忽略。

======交互式的腳本==============

#!/bin/bash
myfun()
{
read -p "your name : " name;
read -p "your age : " age;
echo "hello $name,your age is $age"
if [ $age -gt 18 ]
then
echo "you are ault"
else
echo "you are too young"
read -p "your fave: " fave;
echo "you like $fave"
fi
}
myfun

==================

建立空白文件:touch aa.txt

統計文件行數:wc -l aa.sh

對目錄下的文件進行搜索:grep -rn 'bash' ./   【-r遞歸目錄搜索,-n顯示行號】

對多個文件進行搜索:grep "if" aa.sh hanshu.sh

列出匹配文件位於哪些文件中:grep -l "else" aa.sh  hanshu.sh

打印出行號:grep -n "if" aa.sh

忽略大小寫的搜索:grep -i "IF" aa.sh

同時搜索多個關鍵詞:grep -e "if" -e "else" aa.sh

對於sed有多個關鍵詞時,用一個e就行了,分號隔開:sed -e "s/111/aaa/;s/222/bbb;" sd.txt

排除某些文件進行搜搜:grep "else" . -r --exclude 'aa.sh'    排除某個目錄進行搜索:grep "else" . -r --exclude-dir zz

打印匹配結果的后幾行用-A,前幾行用-B,前后幾行用-C  :例如  grep "else" . -r   -B 3

替換文件中的內容:sed -i 's/you/You/g' hanshu.sh 

打印第2列:ll | awk '{print $2}'

====================

tar可以將多個文件和文件夾保存為單個文件

創建壓縮文件 :   tar -cf tst.tar aa.sh hanshu.sh bb
列出壓縮文件中的文件列表:tar -tf tst.tar

解壓:tar -xf tst.tar -C zz/bb    ---大寫的C

gzip只能壓縮單個文件或數據流,而無法對目錄和多個文件進行歸檔。因此我們需要先創建tar歸檔文件,然后再用gzip進行壓縮。
gzip tst.tar 

gunzip tst.tar.gz

壓縮率有9個等級,1~9,壓縮等級越高,壓縮速度越慢

=============

當然也可以用tar 直接壓縮:tar -czf tst.tar.gz file1 file2 file3         解壓:tar -xzf  tst.tar.gz

======================

 rsync -av /home/test/  /home/backups   這條命令將源目錄(/home/test)中的內容(不包括目錄本身)復制到現有的backups目錄中
rsync -av /home/test   /home/backups 這條命令將包括源目錄本身/home/test)在內的內容復制到新創建的目錄backups

如果我們在源路徑末尾使用/,那么rsync會將sourch_path尾端目錄中的所有內容復制到目的端。
如果沒有使用/rsync會將sourch_path尾端目錄本身復制到目的端。
0 */10 * * * rsync -avz /home/code user@IP_ADDRESS:/home/backups   ---每10小時執行一次,從本地同步到遠端,-a表示要進行歸檔 ;-v表示在stdout上打印出細節信息或進度 ;z表示壓縮
=============對文件逐行進行處理

myread()
{
    while read line;
    do
        echo $line ;
    done

}
myread < ./aa.txt   ;

 ===========/etc/resolv.conf的示例

domain  51osos.com    //定義本地域名
search  www.51osos.com  51osos.com
nameserver 202.102.192.68  //定義DNS服務器的IP地址

nameserver 202.102.192.69 //定義DNS服務器的IP地址
 
        

如果不使用DNS服務器,也可以為IP地址解析添加符號名,這只需要向文件 /etc/hosts中加入條目即可

 

 

 

===========

 一個網絡中的設備如果想同另一個網絡中的設備進行通信,就需要借助某個同時連接了兩個網絡的設備。這個特殊的設備被稱為網關

route -n   【-n指定以數字形式顯示地址。如果使用-nroute會以數字形式的IP地址顯示每一個條目;否則,如果IP地址具有對應的DNS條目,就會顯示符號形式的主機名。】  

ifconfig輸出的最左邊一列是網絡接口名, 可以在ifconfig后加上某一個接口名,查看此接口的詳細信息

============

tst()
{
 for ip in 10.4.5.{1..5} ;   --{start..end}這種記法會由shell
對其進行擴展

do echo $ip; done } tst ;

 

=======判斷是否能ping通

&> /dev/null用於將stderrstdout重定向到 /dev/null,使對應的信息不會在終端上打印出來。 

==============

MAC地址欺騙,機器重啟后會失效  ifconfig eth0 hw ether 00:1c:bf:87:25:d5

獲取IP地址最簡單的方法就是ping給定的域名,然后查看回應信息

在遠程主機中執行命令,並將命令輸出顯示在本地shell中,使用下面的語法:ssh user@host "command1 ; command2 ; command3"

通過FTP傳輸文件可以使用lftp命令,通過SSH連接傳輸文件可以使用sftp

只有遠程主機上安裝有FTP服務器才能使用FTP

SFTP是一個類似於FTP的文件傳輸系統,它運行在SSH連接之上並模擬成FTP接口。它不需要遠端運行FTP服務器來進行文件傳輸,但必須安裝並運行OpenSSH服務器。

列出端口以及運行在端口上的服務:lsof -i 或者 netstat -tnp

===========

iptables -A OUTPUT -d 8.8.8.8 -j DROP

-A表明向鏈(chain)中添加一條新的規則,使用的是OUTPUT鏈,它可以對所有出站(outgoing)的流量進行控制。-d指定了所要匹配的分組目的地址。隨后使用-j來使iptables丟棄(DROP)符合條件的分組。

iptables -A OUTPUT -p tcp -dport 21 -j DROP
-p指定該規則是適用於TCP, -dport指定了對應的端口

清除對iptables鏈所做出的所有改動:iptables --flush
==============

查看內存使用情況:free -h

========
列出文件大小:du file.txt
列出目錄大小:du -a DIRECTORY

 以標准單位KBMBGB顯示磁盤使用情況 ,加上-h 即可 :du -h QH-0.0.77.tar.gz

打印以KB為單位的文件大小: du -k FILE(s)
打印以MB為單位的文件大小: du -m FILE(s)

統計多個文件的大小,加上 -c 即可

du -ch aa.sh hanshu.sh

4.0K    aa.sh
4.0K    hanshu.sh
8.0K    total

=================

只統計當前目錄大小:du -h --max-depth 0 ./

統計當前目錄及1級子目錄大小:du -h --max-depth 1  ./

 ============== 最大的3個文件

du -ak | sort -nrk 1 |head -n 3

a所有文件;  按k單位計算大小;  -n 依照數值的大小排序 ;  -r 逆序;  -k  1 指定按第幾列排序;  

[alauda@ip-10-140-10-186 temp]$ du -ak | sort -nrk 1 |head -n 3
1556    .
1528    ./QH-0.0.77.tar.gz
4    ./zz/aa.sh

==================

du提供磁盤使用情況信息,而df提供磁盤可用空間信息。 df-h選項會以易讀的格式打印磁盤空間信息。
============

統計命令執行時間:time command

 上次重啟時間:last reboot

用uniq去重時,要先排序再去重,如:last |awk '{print $1}' | sort | uniq

 每隔2s執行一次ls命令:watch -n 3 ls ./app

===============

查看進程信息  ps -ef 或 ps  -afx  

========================

打印版本:uname -a
Linux cloud2 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
打印主機名: uname -n
cloud2

==============

編輯crontab:crontab -e

查看:crontab -l
刪除:crontab -r

星號(*)指定命令應該在每個時間段執行。也就是說,如果*是寫在cron作業中的小時字段中,那么命令就會每小時執行一次
在分鍾字段使用*/5,可以每5分鍾運行一次命令
執行cron作業所使用的權限同執行crontab命令所使用的權限相同。如果你需要執行要求更高權限的命令,例如關閉計算機,那么就要以root用戶身份執行crontab
cron作業中指定的命令需要使用完整路徑。
要在啟動時運行命令,請將下面一行加入crontab@reboot command  【如果需要以root用戶的身份運行命令,需要編輯root用戶的crontab
==========
創建用戶:useradd USER -p PASSWORD
將用戶添加到組:addgroup USER GROUP
刪除用戶:deluser USER

修改密碼:passwd USER

添加組:addgroup GROUP
刪除組:delgroup GROUP

===========

 監視磁盤I/O的工具就叫做iotop ,沒有預裝,需要自行安裝

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM