shell腳本總結

1、命令丟失
在搭建服務時,添加服務命令追加到PATH變量文件/etc/profile中,(注意:所有變量都可寫入此文件中永久生效),例如
echo “PATH=/usr/local/mysql/sbin”>> /profile ,如果這樣追加,導致內建命令和系統名都無法調用;解決辦法:
echo“PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin”>> /etc/profile
/bin/bash /etc/profile
source /etc/profile //這樣命令就能正常使用了
2、內建命令和系統命令
在linux中,shell內建命令是指bash(或其它shell)工具集中的命令,在PATH環境變量找不到,例如source;
但很多內建命令一般都會有一個與之同名的系統命令,比如bash中的echo命令與/bin/echo是兩個不同的命令;
使用type 命令來查看某個命令是否爲內建在bash當中的命令,例如
[root@www ~]# type echo
echo is a shell builtin
[root@www ~]# type nslookup
nslookup is /usr/bin/nslookup
3、關於shell介紹
http://blog.csdn.net/sujz12345/article/details/54565056
4、dd命令
1)dd if=/dev/sdb of=/dev/sdd //將本地的/dev/sdb整盤備份到/dev/sdd
雖然sdb這塊硬盤上數據是有限的,但是count會循環一定次數,讀完數據爲止;
2)dd if=/dev/zero of=/home/ex count=10 bs=10M
bs是輸出塊的大小,默認單位爲字節(Byte),count是輸出的次數;即輸出10次塊爲10M的數據,ex文件的大小爲100M;注:bs,同時設置讀入/輸出的塊大小爲bytes個字節;
如果沒有設置count,則會無限循環次數讀取,一直把硬盤撐爆,因爲zero文件中數據爲無窮大
3)增加swap分區文件大小
第一步:創建一個大小爲256M的文件:
#dd if=/dev/zero of=/swapfile bs=1024 count=262144
第二步:把這個文件變成swap文件:
#mkswap /swapfile
第三步:啓用這個swap文件:
#swapon /swapfile
第四步:編輯/etc/fstab文件,使在每次開機時自動加載swap文件:
/swapfile    swap    swap    default   0 0
4)關於swap空間
當系統的物理內存不夠用的時候,就需要將物理內存中的一部分空間釋放出來,以供當前運行的程序使用。那些被釋放的空間可能來自一些很長時間沒有什麼操作的程序,這些被釋放的空間被臨時保存到Swap空間中,等到那些程序要運行時,再從Swap中恢復保存的數據到內存中。這樣,系統總是在物理內存不夠時,才進行Swap交換。 其實,Swap的調整對Linux服務器,特別是Web服務器的性能至關重要。通過調整Swap,有時可以越過系統性能瓶頸,節省系統升級費用。

比如,在linux中打開一個文件但是長時間不編輯也不操作,過了系統默認的時間之後,打開文件的活動進程保存在swap空間中,而且文件也不會被關閉,釋放出內存空間供其他正在活動程序進程使用;系統休眠也是把當前所有的進程都保存到swap中;
可以說,swap空間用來保存沉寂的進程,而實際的物理內存用來處理正在活動的進程

5、壓縮與解壓縮
壓縮比率排行xz>bzip2>gzip
gzip -9 /home/ex //壓縮比9,且原文件消失,生成ex.gz
gzip -d /home/ex.gz //解壓ex.gz,壓縮原文件ex.gz消失
gzip -9 ex >aa.gz //壓縮比9,原文件保留,利用重定向還可以更改壓縮文件名
gzip -dc aa.gz >bb //解壓aa.gz,原壓縮文件保留,重定向更改解壓後的文件名
-c爲標準輸出,即輸出到屏幕;如果不加>bb可見屏幕亂碼
6、查詢/etc/下大於10k的文件並複製到/home
1)find命令一般格式 //在linux命令格式說明中,[ ]表示可有可無的選項
find pathname -options [-print -exec -ok ...]
pathname:查找路徑,.表示當前目錄
-option:表示各種選項,例如-type,-user,-name,-size-mtime等
-print:find命令將匹配的文件標準輸出,即輸出到屏幕
-exec:find命令將匹配的文件,執行-exec參數後邊所跟的命令,所跟的命令格式爲commond {} \; ,注意{}和\;之間有空格;即find找到所需要的文件後,把find的執行結果交給-exec後面的命令繼續處理,{}意思是包含查找結果;如果find找不到所需的文件,則不再繼續處理
-ok:和-exec的作用相同,但是在執行每一個命令之前,都會給出提示,讓用戶來確定是否執行。
查找>100k的文件並移動到指定目錄,兩種命令:
1)find /usr/local/test/ -type f -size +100k | xargs mv -t /tmp
mv -t 目標目錄 原文件 //這樣的mv命令也能移動文件
例如:mv -t /home test.txt ;正常情況下:mv test.txt /home
xargs作用:簡單理解一下,有些命令不接受管道符處理後的標準輸出,如ls;其實xargs就是管道符的一種輔助;並且xargs把前邊傳遞過來的結果分批繼續執行,而不是單條執行;
https://www.cnblogs.com/wangqiguo/p/6464234.html
2)find /etc/ -type f -size +10k -exec cp {} /home \; //{}作用是匹配find查找所有結果;即把find查找結果全部包含進去;-exec作用類似於管道符
find /etc/ -type f -mtime +5 //查找5天前的更改數據內容文件,而-5表示5天內更改數據內容的文件;m表示數據內容被更改;還有-ctime,文件狀態被更改;-atime表示訪問文件
7、echo $SHELL //查看當前shell 而echo $0也是查看當前shell
env //查看當前所有環境變量
8、在腳本中,$$ $0 $n(即$1—$9) $# $ $? $@ $! 的含義如下
$$在腳本中表示腳本執行時的PID號;而不在腳本中表示當前shell的PID,如echo $$;
$0在腳本中表示命令或腳本文件本身;而不在腳本中表示當前shell,如echo $0 ;
$n表示傳遞給腳本的第n個參數,$1表示第1個參數,如/etc/init.d/mysqld start,這個start就是第1個參數;shell腳本最多可直接同時處理9個參數,即$1—$9;
$#表示傳遞給腳本的參數個數;(注意:執行腳本時,傳遞給腳本參數與腳本中是否用到$# $
$n等變量沒有絕對關係,如/etc/init.d/mysqld start,沒有輸出有幾個參數和參數是什麼;)
$! 表示shell中最後一個進程的pid號
$表示傳遞給腳本的所有參數;$@與$的含義差不多,但是如果在腳本中$和$@被雙引號””包含時,$會將所有參數作爲一個整體,以$1 $2 $3 ...形式單行輸出所有參數;
而$@將各參數分開,多行羅列把$1 $2 $3 ...輸出
例如: 在這裏,如果腳本處理的參數超過9個,則以${10}形式括起來
#!/bin/bash
#description canshu
echo "$1 $2 ${10}"
echo "$0"
echo "$*"
echo "$#"
執行腳本:
[root@www practice_scripts]# sh num.sh q w r t y u d d fb rer rer er3
q w rer
num.sh
q w r t y u d d fb rer rer er3
12
9、seq 1 10 //直接輸入此命令,輸出1—10這10個數,每列1個;可結合for循環語句做取值列表用
10、sleep //設定命令暫停時間; 如sleep 1 和sleep 1s暫停爲1秒;sleep 1m 暫停爲1分鐘;sleep 1h 暫停爲1小時
sleep在腳本中的作用,有時寫一些監控腳本,在循環語句中需要sleep暫停,以便下條命令暫停執行,防止系統瞬間佔用資源過高,導致衝突;補充,在shell的for循環中,可以用for ((i=1; i<=100; i++))循環取值,可以不使用python風格的for i in {1..100}
http://blog.csdn.net/wr339988/article/details/70768499
11、wc test.tex //統計文件中的行數 單詞數 字節數
wc -l test.txt //統計文件中的行數;在linux中,換行回車\nr算作一個字節
12、sed -n “s/q/w/g”files.txt //用sed把文件中q字符替換爲w,這裏-n選項是在命令處理過程中不在屏幕輸出任何內容,即安靜模式
13、當執行一次bash命令,就會產生一個子shell; export設置全局變量,就是爲了子shell能夠使用變量
14、date命令
date +%F //年-月-日 格式輸出日期;一般在數據備份時加時間戳,引用$(date +%F)變量;如mysqldump -u root -p --all-databases > /root/mysql(data +%F).sql
date +%Y%m%d //年月日 緊密格式輸出日期 20180306
15、關於磁盤命令,及磁盤常規修復命令
1)
16、關於sort命令,格式
sort 選項 參數 //參數爲要處理的文件,常用來處理日誌文件(如web日誌訪問量最大IP)
原理含義:將文件的每一行作爲一個單位,相互比較,比較原則是從首字符向後(比較每行首字符),依次按ASCII碼值進行比較(字母按照a—z順序,不分大小寫;數字按照0—9順序),最後將他們按升序標準輸出;如果sort sed.txt -o sed.tex,則不會標準輸出,而是把排序結果輸出到源文件
選項解釋:
-d 忽略每行的空格字符
-u 排序並且有重複的行只的話輸出其中1行,然後標準輸出; u即unique
-r 反向排序(即降序排序);-o重定向輸出到源文件,因爲sort 不支持 >>重定向輸出
-n按照數字排序,不使用-n時默認數字被作爲字符串處理;例如,sed.txt中有第一行10,第二行5,如果不用-n,則會先輸出10,然後輸出5,因爲sort會根據首字符進行比較
-t 指定區域分隔符;即指定把文件中按照哪個字符分成列;
-k指定按照哪塊分隔區域的首字符進行排序,即按照哪列首字符進行排序;例如:
[root@www ~]# cat test.txt
12 we:as:ty df
34 rt:34:yu 67
df 90:cv:10 xd
wd 88:66:15 36
[root@www ~]# sort -t : -k 2 test.txt
34 rt:34:yu 67
wd 88:66:15 36
12 we:as:ty df
df 90:cv:10 xd
這裏指定了 : 爲分隔符,那麼這個文件就被分成3列,因爲有2個冒號;注意,單獨使用-t並沒有多大意義;-k就是按照第2列進行排序(是視覺的第3列);如果不適用-t指定分隔符,則-k默認使用空格字符作爲區域分隔符
補充:在文件中,域的概念就是指某列
17、uniq命令,格式:
uniq 選項 參數 //參數爲要處理的文件,常結合sort命令使用
原理含義:去除文件中的重複行,一般結合sort命令使用
-i 不區分大小寫
-c 進行計數,即在每行左側輸出出現的次數,此選項是一般是必加項;例如:
[root@www ~]# cat fi.txt
world:10 99
hello:20 88
linux:30 77
hello:20 88
world:10 99
linux:30 77
world:10 99
hello:20 88
hahah:qw cc
結合sort使用:
[root@www ~]# sort fi.txt | uniq -c
1 hahah:qw cc
3 hello:20 88
2 linux:30 77
3 world:10 99
-d 僅顯示文件中重複存在的行;貌似此選項結合sort命令纔有效果
[root@www ~]# sort fi.txt | uniq -dc
3 hello:20 88
2 linux:30 77
3 world:10 99
-u 僅顯示文件中單獨、不重複的行;貌似此選項結合sort命令纔有效果
[root@www ~]# sort fi.txt | uniq -uc
1 hahah:qw cc
18、nmap命令
nmap -A -O -PO -vv 網段/IP/域名 //掃描指定主機的OS、端口、MAC等信息

推薦掃描類型:

-PO:主機禁止ping時,可強制掃描

-sU:掃描UDP

-sT:掃描TCP

-p:掃描指定端口 //即 nmap ip -p 端口

19、關於du 和 df命令區別
1)du -sh /etc //統計/etc目錄的大小,以兆爲單位輸出;後邊一定要加所統計的對象
2)df -Th //查看硬盤各分區的使用情況,以及百分比
3) df -i //查看硬盤各分區的inode號的使用情況,以及百分比
20、關於/etc/proc目錄介紹
Linux系統上的/proc目錄是一種文件系統,即proc文件系統。與其它常見的文件系統不同的是,/proc是一種僞文件系統(也即虛擬文件系統),存儲的是當前內核運行狀態的一系列特殊文件,用戶可以通過這些文件查看有關係統硬件及當前正在運行進程的信息;
此目錄下的文件被稱作虛擬文件,其中有些文件雖然使用查看命令查看時會返回大量信息,但文件本身的大小卻會顯示爲0字節。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章