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 -x和set +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的輸入,就必須將 -print0與find結合使用,以字符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指定以數字形式顯示地址。如果使用-n, route會以數字形式的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用於將stderr和stdout重定向到 /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
以標准單位KB、 MB或GB顯示磁盤使用情況 ,加上-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 ,沒有預裝,需要自行安裝