工作中常用的 Linux 命令
awk
示例:
env變數值如下,需要獲得pkg_url的連結值:
{"name": "michael", "sex": "male", "pkg_url": "www.github.com", "number": "888"}
pkg_url=$(echo $env | awk -F "pkg_url\": \"" '{print $2}' | awk -F "\"," '{print $1}') echo $pkg_url www.github.com
-F 指定分隔規則,因為分隔規則中包含了雙引號,所以需要用轉義符號。
# 格式 $ awk 動作 檔名 # 示例 $ awk '{print $0}' demo.txt echo 'hello:michael:xiang'|awk -F ':' '{print $1}'
## basename
basename命令用於列印目錄或者檔案的基本名稱
[root@HGH1000059721 test]# basename a.tar .tar#字尾:可選引數,指定要去除的檔案字尾字串。 a [root@HGH1000059721 test]# basename /tmp/test/a.tar#不帶字尾,獲取檔名 a.tar
參考:
cp
將目錄 src
複製到 dest
目錄下,複製好後, dest/src
:
cp -r src dest
將目錄 src
下的內容複製到 dest
目錄下:
cp -r src/* dest
複製檔案,覆蓋不詢問:
cp -nrf a.txt b.txt
系統預設給 cp
命令設定了別名 cp -i
,所以,複製時有衝突需要確認,使用如下方式即可不改變別名,也實現預設覆蓋:
/bin/cp xx yy
參考:
crontab
# For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # |.------------- hour (0 - 23) # ||.---------- day of month (1 - 31) # |||.------- month (1 - 12) OR jan,feb,mar,apr ... # ||||.---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # ||||| # ***** user-namecommand to be executed
在以上各個欄位中,還可以使用以下特殊字元:
- 星號(*):代表所有可能的值,例如month欄位如果是星號,則表示在滿足其它欄位的制約條件後每月都執行該命令操作。
- 逗號(,):可以用逗號隔開的值指定一個列表範圍,例如,“1,2,5,7,8,9”
- 中槓(-):可以用整數之間的中槓表示一個整數範圍,例如“2-6”表示“2,3,4,5,6”
正斜線(/):可以用正斜線指定時間的間隔頻率,例如“0-23/2”表示每兩小時執行一次。同時正斜線可以和星號一起使用,例如*/10,如果用在minute欄位,表示每十分鐘執行一次。
任務執行檔案所在位置:
/var/spool/cron/crontabs
命令引數:
-
-u
user:用來設定某個使用者的crontab服務;
file:file是命令檔案的名字,表示將file做為crontab的任務列表檔案並載入 -
-e
:編輯某個使用者的crontab檔案內容。如果不指定使用者,則表示編輯當前使用者的crontab檔案。 -
-l
:顯示某個使用者的crontab檔案內容,如果不指定使用者,則表示顯示當前使用者的crontab檔案內容。 -
-r
:從/var/spool/cron目錄中刪除某個使用者的crontab檔案,如果不指定使用者,則預設刪除當前使用者的crontab檔案。 -
-i
:在刪除使用者的crontab檔案時給確認提示
每隔2分鐘執行 /tmp/test.sh
指令碼:
crontab -e # 使用crontab -e命令,編輯的是/var/spool/cron下對應使用者的 cron 檔案 */2 * * * * /tmp/test.sh
第星期六、星期日的時10分重啟smb-也就是每週六、週日:
10 1 * * 6,0 /etc/init.d/smb restart >>/tmp/run.log 2>&1
例項4:每隔兩天的上午8點到11點的第3和第15分鐘執行:
3,15 8-11 */2** myCommand
例項5:清理httpd服務日誌超過3天的內容:
0 5 * * * /usr/bin/find /var/log/httpd/ -type f -mtime +3 -exec rm -rf {} \;
例項6:通過正則清理指定資料夾的內容
#update-20181122: clean dir +120 days 0 6 * * * find /data/michael -maxdepth 7 -type d -mtime +120 -regextype posix-egrep -regex '.*/[0-9]{2}/[0-9]{6}$' -exec rm -rf {} \;
啟動 / 停止 / 重啟 crontab
$ /etc/init.d/crond start $ /etc/init.d/crond stop $ /etc/init.d/crond restart
檢視日誌
$ tail -f /var/log/cron
參考:
date
選項:
不加: 顯示當前的時間.
:顯示字串所指的日期與時間。字串前後必須加上雙引號;
:根據字串來設定日期與時間。字串前後必須加上雙引號;
-u:顯示GMT;
--help:線上幫助;
--version:顯示版本資訊。
引數 <+時間日期格式>:指定顯示時使用的日期時間格式。
就是格式化字串處理.當需要用到空格時要使用雙引號,如 "+%Y-%m-%d %H:%M:%S"
.
一般, %Y %m %d %H %M %S
是最基本的. 使用星期月份時也會用到 %a %b
示例
VERSION=$(date +%Y%m%d%H%M%S) #20180410192702 #date後面有空格 time=$(date "+%Y-%m-%d %H:%M:%S") #時間格式中有空格,需要加引號 » date "+%Y-%m-%d %T %a %A" 2018-06-04 11:31:25 Mon Monday
參考:
df
通過 df
命令很容易發現那個磁碟的儲存空間快沒了。檢視掛載狀態和硬碟使用量資訊:
df -hT
dig
檢視域名的資訊。一般一個域名都會繫結到多個 IP 上,ping 命令只能一次看到一個 ip,這個可以看到域名解析的資訊
dig baidu.com
可能機器上沒有這個命令,可以如下 方式 安裝:
yum install -y bind-utils
參考:
du
du
命令可以顯示某個特定目錄(預設情況下是當前目錄)的磁碟使用情況。這一方法可以判斷系統上某個目錄下是不是有超大的檔案。
檢視當前資料夾的檔案大小:
du -sh * du -sh /usr/* | sort -rn # 按M大小排序
env
檢視環境變數值,例:
檢視帶有SVN的環境變數值:
env|grep SVN
find
例項:定時清理httpd服務日誌超過3天的內容:
0 5 * * * /usr/bin/find /var/log/httpd/ -type f -mtime +3 -exec rm -rf {} \;
例項: 通過正則清理指定資料夾的內容
#update-20181122: clean dir +120 days 0 6 * * * find /data/michael -maxdepth 7 -type d -mtime +120 -regextype posix-egrep -regex '.*/[0-9]{2}/[0-9]{6}$' -exec rm -rf {} \;
例項:搜尋/etc目錄下第一層的conf配置檔案,資料夾下層的不需要
find /etc/ -maxdepth 1 -name "*.conf" # 最好加上引號
例項:只搜尋當前目錄,但是不包括.git目錄,統計目錄數
find . -maxdepth 1 -mindepth 1 -type d | grep -v .git |wc -l
例項:僅列出目錄
find . -type d -maxdepth 1
參考:
fdisk
fdisk -l
看到目前系統中所有分割槽的資訊
https://blog.csdn.net/cc_net/article/details/2894510
free
free命令可以顯示Linux系統中空閒的、已用的實體記憶體及swap記憶體,及被核心使用的buffer。在Linux系統監控的工具中,free命令是最經常使用的命令之一。
free -h -s 2 -t
-h -s -t
# 結果 totalusedfreesharedbuff/cacheavailable Mem:7.6G935M6.1G9.7M631M6.4G Swap:7.5G0B7.5G Total:15G935M13G
- total:總計實體記憶體的大小。
- used:已使用多大。
- free:可用有多少。
- Shared:多個程序共享的記憶體總額。
- Buffers/cached:磁碟快取的大小
- 交換分割槽SWAP,也就是我們通常所說的虛擬記憶體
從應用程式角度來看,對於應用程式來說,buffers/cached 是等於可用的,因為buffer/cached 是為了提高檔案讀取的效能,當應用程式需在用到記憶體的時候,buffer/cached 會很快地被回收。
所以從應用程式的角度來說 可用記憶體=系統free memory+buffers+cached
我們看linux,只要不用swap的交換空間,就不用擔心自己的記憶體太少.如果常常swap用很多,可能你就要考慮加實體記憶體了.這也是linux看記憶體是否夠用的標準.
+buffers/cache,即對應用程式來說free的記憶體太少了,也是該考慮優化程式或加記憶體了
參考:
fuser
fuser通常被用在診斷系統的“resource busy”問題,通常是在你希望umount指定的掛載點得時候遇到。 如果你希望kill所有正在使用某一指定的file, file system or sockets的程序的時候,你可以使用-k option
fuser –k –i /path/to/your/filename # 加上-i 表示殺死之前,需確認
groups
whoami # 檢視使用者名稱 groups # 檢視當前使用者所屬組
grep
語法:
grep [options] pattern [file]
# 遞迴、顯示行號、忽略大小寫、顯示搜到的匹配內容上下2行 搜尋範圍是當前目錄下 grep -rni 'github.com'-C 2 .
grep 'shopbase' /home/admin -r -n --include *.{vm,java} #指定檔案字尾 grep 'shopbase' /home/admin -r -n --exclude *.{vm,java} #反匹配
參考:
gzip
gzip是GNU專案的產物。這個軟體下買呢含有下面的工具:
- gzip :用來壓縮檔案
- gzcat:用來檢視壓縮過的文字檔案的內容
- gunzip:用來解壓檔案。
gzip xxx gzip -l <filename> # list compressed file contents
head
顯示前n行內容:
head -n
https://www.linuxdaxue.com/linux-command-intro-head.html
less
在 more
的時候,我們並沒有辦法向前面翻,只能往後面看,但若使用了 less
時,就可以使用 [pageup] [pagedown]
等按鍵的功能來往前往後翻看檔案。
locate
locateGPG-KEY # find /etc -name '*GPG-KEY*' 等同
可能系統沒有自帶 locate
命令,可以使用 yum install mlocate -y
安裝,安裝結束執行 updatedb
命令。
ls
僅顯示目錄:
ll -d
ls命令顯示檔案大小,會根據檔案大小自己決定單位,M或者Kb或者G
ll -h
mount
mount
可以顯示全部掛載情況。
將分割槽掛載到目錄:
mount /dev/xvde /data
mkdir
mkdir sysadmin/admim_{1,2,3,4,5}
參考:
netstat
檢查端口占用
netstat -anp|grep 80
rm
只刪除當前資料夾下的隱藏檔案和隱藏資料夾:
rm -rf .*
https://blog.csdn.net/ficksong/article/details/52447729
rpm
我的系統中安裝了那些rpm軟體包
rpm -qa
如果要查詢所有安裝過的包含某個字串sql的軟體包
rpm -qa | grep sql
一個rpm包中的檔案安裝到那裡去了?
rpm -ql 包名
軟體包的解除安裝
rpm -e
參考:http://man.linuxde.net/rpm
rpm2cpio
RPM 包解壓縮:
# 注意,要加上 cpio -div,否則終端會列印多餘的內容出來 rpm2cpio xxxx.rpm | cpio -div
你的 Linux 下可能沒有rpm2cpio這個命令,用過簡單指令安裝即可:
sudo apt-get installrpm2cpio sudo yum install rpm2cpio
sed
eg1:擷取日誌中的兩行之間的內容,同時去掉匹配的首尾行:
cat mock.log |sed -n '/tee/,/find/p' mock.log|sed -n '1!p'|sed -n '$!p'|awk '{print $2,$3}'
eg2:
nl passwd|sed "1d;10d" #刪除第1行,第10行
eg3:
sed -i -e "1i%define upstream_version $UPSTREAMVERSION\\" *.spec #第一行插入 sed -i -e "s/UPSTREAMVERSION/$UPSTREAMVERSION/g" *.spec #替換
參考:
SELinux
sestatus [-v] # 檢視selinux開啟狀態 getenforce # 檢視當前selinux的狀態
selinux開啟常常影響其他一些服務,比如httpd等,所以,運維往往一般拿到機器就會預設將其關閉。
setenforce 1 # 設定SELinux 成為enforcing模式 setenforce 0 # 設定SELinux 成為permissive模式 不重啟關閉selinux的解決辦法
開機重啟後,上面利用 setenforce
方式修改的值會失效,所以,開機重啟也有效的話,需要修改如下檔案:
/etc/selinux/config # 檔案的軟連結是/etc/sysconfig/selinux 是
sort
對之前提到的密碼檔案 /etc/passwd
根據使用者ID進行數值排序。 -k
和 -t
引數在對安欄位分割的資料進行排序時非常有用。
sort -t ":" -k 3 -n /etc/passwd
systemctl
任務 | 舊指令 | 新指令 |
---|---|---|
使某服務自動啟動 | chkconfig –level 3 httpd on | systemctl enable httpd.service |
使某服務不自動啟動 | chkconfig –level 3 httpd off | systemctl disable httpd.service |
檢查服務狀態 | service httpd status | systemctl status httpd.service |
顯示所有已啟動的服務 | chkconfig –list | systemctl list-units –type=service |
啟動某服務 | service httpd start | systemctl start httpd.service |
停止某服務 | service httpd stop | systemctl stop httpd.service |
重啟某服務 | service httpd restart | systemctl restart httpd.service |
sha256sum
生成檔案對應的sha256值:
sha256sum FusionSphere_Upgrade_6.2.50.4001.tar.gz > a.sha256sum # 校驗 sha256sum -c <(grep FusionSphere_Upgrade_6.2.50.4001.tar.gz a.sha256sum) # 校驗
參考:
tar
目前Unix和Linux上最廣泛使用的歸檔工具是 tar 命令。
tar function [options] object1 object2 ……
首先,建立一個歸檔檔案:
tar -cvf test.tar test/ test2/
建立了名為test.tar歸檔檔案,含有 test 和 test2 目錄內容。
接著,列出 tar 檔案 test.tar 內容(但並不提取檔案):
tar -tf test.tar
最後用命令提取檔案:
tar -xvzf test.tar
tar命令是給整個目錄建立歸檔檔案的簡便方法
竅門:下載開源軟體之後,經常會看到檔名以.tgz結尾。這些事gzip壓縮過的tar檔案,可以用tar -zxvf filename.tgz來解壓
tee
tee命令用於將資料重定向到檔案,另一方面還可以提供一份重定向資料的副本作為後續命令的stdin。簡單的說就是把資料重定向到給定檔案和螢幕上。
eg1 在終端列印stdout同時重定向到檔案中:
ls | tee out.txt | cat -n
eg2 建立daemon.json檔案,EOF之間內容作為stdin:
tee /etc/docker/daemon.json << EOF { "insecure-registries" : [ "", ""] } EOF
<< EOF …… EOF
的作用是在命令執行過程中使用者自定義輸入,它類似於起到一個臨時檔案的作用,只是比使用檔案更方便靈活。
EOF妙用:
它的作用就是將兩個 delimiter
之間的內容(Here Document Content 部分) 傳遞給 cmd
作為輸入引數。
cmd << delimiter Here Document Content delimiter
[root@ecs-6b86 tmp]# cat << EOF >tt.sh 123123123 345345 asdfasds EOF
自定義EOF,比如自定義為michael
[root@slave-server opt]# cat << michael > haha.txt
ggggggg44444446666666michael
<<
變為 <<-
。 使用 <<-
的唯一變化就是Here Document 的內容部分每行前面的 tab
(製表符)將會被刪除掉,這種用法是為了編寫Here Document的時候可以將內容部分進行縮排,方便閱讀程式碼。
有時指令碼內容裡變數不想被系統環境變數替換掉,可以通過在起始的 delimiter的前後新增 " 來實現
參考:
tree
tree -FCL 2 FusionUpgrade
time
time nslookup michael.com nslookup: can't resolve '(null)': Name does not resolve Name:micahel.com Address 1: 10.248.250.158 real0m 5.00s user0m 0.00s sys0m 0.00s
test
- 判斷字串是否為空,可以通過
help test
檢視
-z STRINGTrue if string is empty. -n STRING STRINGTrue if string is not empty.
示例:
#!/bin/sh STRING="" # -z if [ -z "$STRING" ]; then echo "STRING is empty" fi if [ -n "$STRING" ]; then echo "STRING is not empty" fi # STRING is empty
- linux shell 中判斷字串為空的正確方法 :有趣的示例,強調了需要加引號的重要性
- Linux shell 程式設計 字串null值 的 條件判斷? :解釋了,為何加引號,bash的內建命令test在只有一個引數的情況下,只要引數不為空就返回真
tcpdump
首先,先用 tcpdump -D
命令列出可以抓包的網路介面:
$ tcpdump -D 1.virbr0 2.docker0 3.bluetooth0 (Bluetooth adapter number 0) 4.nflog (Linux netfilter log (NFLOG) interface) 5.nfqueue (Linux netfilter queue (NFQUEUE) interface) 6.usbmon1 (USB bus number 1) 7.usbmon2 (USB bus number 2) 8.wlp3s0 9.enp5s0 10.any (Pseudo-device that captures on all interfaces) 11.lo [Loopback]
其中, lo
就是 localhost
。其中特殊介面 any 可用於抓取所有活動的網路介面的資料包。
$ sudo tcpdump -i any -c5 -nn icmp port 80 -A -w webserver.pcap tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes 22:10:51.809330 IP 192.168.3.43.22 > 192.168.3.66.50051: Flags [P.], seq 2040167007:2040167203, ack 59350146, win 1432, options [nop,nop,TS val 89942170 ecr 111122685], length 196 22:10:51.812472 IP 192.168.3.43.22 > 192.168.3.66.50051: Flags [P.], seq 196:416, ack 1, win 1432, options [nop,nop,TS val 89942173 ecr 111122685], length 220 22:10:51.833093 IP 192.168.3.66.50051 > 192.168.3.43.22: Flags [.], ack 0, win 23490, options [nop,nop,TS val 111123121 ecr 89942122], length 0 22:10:51.833193 IP 192.168.3.43.22 > 192.168.3.66.50051: Flags [P.], seq 416:612, ack 1, win 1432, options [nop,nop,TS val 89942194 ecr 111123121], length 196 22:10:51.835541 IP 192.168.3.66.50051 > 192.168.3.43.22: Flags [.], ack 196, win 23487, options [nop,nop,TS val 111123121 ecr 89942170], length 0 5 packets captured 7 packets received by filter 0 packets dropped by kernel
-
-c
選項可以用於限制 tcpdump 抓包的數量 - 用
-n
選項顯示 IP 地址,-nn
選項顯示埠號 -
icmp
這裡用作過濾條件,只要抓取ICMP
報文 -
port
指定埠號,根據埠號來篩選資料包 - tcpdump 提供了兩個選項可以檢視資料包內容,
-X
以十六進位制打印出資料報文內容,-A
列印資料報文的 ASCII 值 - 使用
-w
選項來儲存資料包而不是在螢幕上顯示出抓取的資料包
tcpdump 將資料包儲存在二進位制檔案中,所以不能簡單的用文字編輯器去開啟它。使用 -r
選項引數來閱讀該檔案中的報文內容:
tcpdump -nn -r webserver.pcap
用 host 引數只抓取和特定主機相關的資料包:
sudo tcpdump -i any -c5 -nn host 54.204.39.132
可以使用括號來建立更為複雜的過濾規則,但在 shell 中請用引號包含你的過濾規則以防止被識別為 shell 表示式:
$ sudo tcpdump -i any -c5 -nn "port 80 and (src 192.168.122.98 or src 54.204.39.132)"
-
src
抓取源 IP 地址 - 使用
dst
就是按目的 IP/主機名來篩選資料包 - 使用
and
以及or
邏輯操作符來建立過濾規則
參考:
unzip
unzip -l demo1-0.1-py2.7.egg
unzip -o -d /home/sunny myfile.zip
/home/sunny/
-o
:不提示的情況下覆蓋檔案;
-d
:-d /home/sunny 指明將檔案解壓縮到/home/sunny目錄下;
參考:
wc
wc [-clw][--help][--version][檔案...]
引數:
-c或--bytes或--chars 只顯示Bytes數。 -l或--lines 只顯示行數。 -w或--words 只顯示字數。 --help 線上幫助。 --version 顯示版本資訊。
who
who //顯示當前登入系統的使用者
顯示標題欄
# who -H
只顯示當前使用者
# who -m -H
wget
將遠端目錄下的全部內容下載到 save目錄下
。 -nd
引數表示,如果遠端目錄下也有子目錄,會將子目錄中的檔案下載下來而不建立多餘目錄。
wget -r -np -nd -R "index.html*" -P test http://xxx/FusionUpgrade/master/euler/20181101130551/ # 注意,URL末尾需要有/,否則會遞迴下載的
- -r:遞迴下載,下載指定網頁某一目錄下(包括子目錄)的所有檔案
- -nd:–-no-directories 不建立目錄
- -np:–-no-parent 不要追溯到父目錄
- P:指定下載下來的存放目錄,沒有會自動建立
- -nH:–-no-host-directories 不建立主機目錄
示例2:
將遠端資料夾原封不動下載下來,並且下載下來的本地路徑也是遠端目錄,而不會建立多級目錄。 -nH
表示不會建立
xxx.com
目錄, --cut-dirs
將其餘多餘層級目錄不下載,實現效果下載到本地就只是 DLRN_RPMS
目錄。
wget -r -p -k -np -nH --cut-dirs=4 http://xxx.com/cps/FusionNetwork-for-fc/master/suse/DLRN_RPMS/
參考:
watch
watch -d 'ls -l|grep scf'# 監測當前目錄中 scf' 的檔案的變化 watch -n 10 'cat /proc/loadavg' # 10秒一次輸出系統的平均負載 watch -n 1 -d netstat -ant# 命令:每隔一秒高亮顯示網路連結數的變化情況
參考:
systemd service服務
xargs
為了快速修改後綴名字
原始檔夾下:
CentOS-base.repo.repo.bak epel.repo.repo.bak
方法一:
ls *.bak|awk -F. '{print $1}'|xargs -t -i mv {}.repo.repo.bak {}.repo
小夥伴們覺得有用的話,動動手指點個「推薦」吧 :)