工做中經常使用的 Linux 命令

awk

示例:php

env變量值以下,須要得到pkg_url的連接值:html

{"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 指定分隔規則,由於分隔規則中包含了雙引號,因此須要用轉義符號。java

# 格式
$ awk 動做 文件名

# 示例
$ awk '{print $0}' demo.txt

$ echo 'hello:michael:xiang'|awk -F ':' '{print $1}'

# 若是隻是顯示/etc/passwd的帳戶
$ cat /etc/passwd |awk  -F ':'  '{print $1}'

basename

basename 命令用於打印目錄或者文件的基本名稱linux

[root@HGH1000059721 test]# basename a.tar .tar  #後綴:可選參數,指定要去除的文件後綴字符串。
a
[root@HGH1000059721 test]# basename /tmp/test/a.tar  #不帶後綴,獲取文件名
a.tar

參考:git

cp

將目錄src複製到dest目錄下,複製好後,dest/src:github

cp -r src dest

將目錄src下的內容複製到dest目錄下:web

cp -r src/* dest

複製文件,覆蓋不詢問:正則表達式

cp -nrf a.txt b.txt

系統默認給cp命令設置了別名cp -i,因此,複製時有衝突須要確認,使用以下方式便可不改變別名,也實現默認覆蓋:sql

/bin/cp xx yy

參考:docker

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-name  command to be executed

![圖片描述][1]

在以上各個字段中,還可使用如下特殊字符:

  • 星號(*):表明全部可能的值,例如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

第星期6、星期日的時10分重啓smb-也就是每週6、週日:

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

選項:
不加: 顯示當前的時間.
-d <字符串> :顯示字符串所指的日期與時間。字符串先後必須加上雙引號;
-s <字符串> :根據字符串來設置日期與時間。字符串先後必須加上雙引號;
-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

dig 和 nslookup 做用有些相似,都是DNS查詢工具。dig,實際上是一個縮寫,即 Domain Information Groper

查看域名的信息。通常一個域名都會綁定到多個 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

實例:刪除當前目錄下全部的swp文件

find . -type f -name "*.swp" -delete

實例:定時清理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 每2秒,顯示內存使用信息
  • -t 顯示內存總和
# 結果
              total        used        free      shared  buff/cache   available
Mem:           7.6G        935M        6.1G        9.7M        631M        6.4G
Swap:          7.5G          0B        7.5G
Total:          15G        935M         13G
  • 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} #反匹配

實例:-c 統計文件中包含文本的次數

grep -c "text" filename

參考:

gzip

gzip是GNU項目的產物。這個軟件下買呢含有下面的工具:

  • gzip :用來壓縮文件
  • gzcat:用來查看壓縮過的文本文件的內容
  • gunzip:用來解壓文件。
gzip xxx
gzip -l <filename> # list compressed file contents

顯示前n行內容:

head -n

https://www.linuxdaxue.com/linux-command-intro-head.html

less

more的時候,咱們並無辦法向前面翻,只能日後面看,但若使用了less時,就可使用 [pageup] [pagedown] 等按鍵的功能來往前日後翻看文件。

locate

locate  GPG-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 install  rpm2cpio
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

ggggggg
4444444
6666666
michael

<< 變爲 <<-。 使用 <<- 的惟一變化就是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
real    0m 5.00s
user    0m 0.00s
sys     0m 0.00s

test

  • 判斷字符串是否爲空,能夠經過help test查看
-z STRING      True if string is empty.
    
      -n STRING
         STRING      True 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

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

把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

xargs 可以將輸入數據轉化爲特定命令的命令行參數;這樣,能夠配合不少命令來組合使用。好比grep,好比find。

實例:快速修改後綴名字

源文件夾下:

CentOS-base.repo.repo.bak
epel.repo.repo.bak

方法一:

ls *.bak|awk -F. '{print $1}'|xargs -t -i mv {}.repo.repo.bak {}.repo

參考

最後

  • 本文做者: Michael翔
  • 本文連接: https://michael728.github.io/2018/07/05/linux-useful-commands-in-work/

小夥伴們以爲有用的話,動動手指點個「推薦」吧 :)

相關文章
相關標籤/搜索