這些年蒐集的 Linux 常用命令

責編:中文妹 | 來源:開源 Linux

原文:siye1982.github.io/2016/02/25/linux-list

大家好,我是中文妹。

雖然平時大部分工作都是和網絡相關, 但會接觸 Linux 系統, 尤其是使用了 Mac 之後, 每天都是工作在黑色背景的命令行環境中. 自己記憶力不好, 很多有用的 Linux 命令不能很好的記憶, 現在逐漸總結一下, 以便後續查看。

基本操作

Linux 關機, 重啓
# 關機
shutdown -h now

# 重啓
shutdown -r now
查看系統, CPU 信息
# 查看系統內核信息
uname -a

# 查看系統內核版本
cat /proc/version

# 查看當前用戶環境變量
env

cat /proc/cpuinfo

# 查看有幾個邏輯cpu, 包括cpu型號
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c

# 查看有幾顆cpu,每顆分別是幾核
cat /proc/cpuinfo | grep physical | uniq -c

# 查看當前CPU運行在32bit還是64bit模式下, 如果是運行在32bit下也不代表CPU不支持64bit
getconf LONG_BIT

# 結果大於0, 說明支持64bit計算. lm指long mode, 支持lm則是64bit
cat /proc/cpuinfo | grep flags | grep ' lm ' | wc -l
建立軟連接
ln -s /usr/local/jdk1.8/ jdk
rpm 相關
# 查看是否通過rpm安裝了該軟件
rpm -qa | grep 軟件名
sshkey
# 創建sshkey
ssh-keygen -t rsa -C your_email@example.com

#id_rsa.pub 的內容拷貝到要控制的服務器的 home/username/.ssh/authorized_keys 中,如果沒有則新建(.ssh權限爲700, authorized_keys權限爲600)
命令重命名
# 在各個用戶的.bash_profile中添加重命名配置
alias ll='ls -alF'
同步服務器時間
sudo ntpdate -u ntp.api.bz
後臺運行命令
# 後臺運行,並且有nohup.out輸出
nohup xxx &

# 後臺運行, 不輸出任何日誌
nohup xxx > /dev/null &

# 後臺運行, 並將錯誤信息做標準輸出到日誌中 
nohup xxx >out.log 2>&&
強制活動用戶退出
# 命令來完成強制活動用戶退出.其中TTY表示終端名稱
pkill -kill -t [TTY]
查看命令路徑
which <命令>
查看進程所有打開最大 fd 數
ulimit -n
配置 dns
vim /etc/resolv.conf
nslookup, 查看域名路由表
nslookup google.com
last, 最近登錄信息列表
# 最近登錄的5個賬號
last -n 5
設置固定 ip
ifconfig em1  192.168.5.177 netmask 255.255.255.0
查看進程內加載的環境變量
# 也可以去 cd /proc 目錄下, 查看進程內存中加載的東西
ps eww -p  XXXXX(進程號)
查看進程樹找到服務器進程
ps auwxf
查看進程啓動路徑
cd /proc/xxx(進程號)
ls -all
# cwd對應的是啓動路徑
添加用戶, 配置 sudo 權限
# 新增用戶
useradd 用戶名
passwd 用戶名

#增加sudo權限
vim /etc/sudoers
# 修改文件裏面的
# root    ALL=(ALL)       ALL
# 用戶名 ALL=(ALL)       ALL
強制關閉進程名包含 xxx 的所有進程
ps aux|grep xxx | grep -v grep | awk '{print $2}' | xargs kill -9

磁盤, 文件, 目錄相關操作

vim 操作
#normal模式下 g表示全局, x表示查找的內容, y表示替換後的內容
:%s/x/y/g

#normal模式下
0  # 光標移到行首(數字0)
$  # 光標移至行尾
shift + g # 跳到文件最後
gg # 跳到文件頭

# 顯示行號
:set nu

# 去除行號
:set nonu

# 檢索
/xxx(檢索內容)  # 從頭檢索, 按n查找下一個
?xxx(檢索內容)  # 從尾部檢索
打開只讀文件, 修改後需要保存時 (不用切換用戶即可保存的方式)
# 在normal模式下
:w !sudo tee %
查看磁盤, 文件目錄基本信息
# 查看磁盤掛載情況
mount

# 查看磁盤分區信息
df

# 查看目錄及子目錄大小
du -H -h

# 查看當前目錄下各個文件, 文件夾佔了多少空間, 不會遞歸
du -sh *
wc 命令
# 查看文件裏有多少行
wc -l filename

# 看文件裏有多少個word
wc -w filename

# 文件裏最長的那一行是多少個字
wc -L filename

# 統計字節數
wc -c

常用壓縮, 解壓縮命令

壓縮命令
tar czvf xxx.tar 壓縮目錄

zip -r xxx.zip 壓縮目錄
解壓縮命令
tar zxvf xxx.tar

# 解壓到指定文件夾
tar zxvf xxx.tar -C /xxx/yyy/

unzip xxx.zip

變更文件所屬用戶, 用戶組

chown eagleye.eagleye xxx.log

cp, scp, mkdir

#複製
cp xxx.log

# 複製並強制覆蓋同名文件
cp -f xxx.log

# 複製文件夾
cp -r xxx(源文件夾) yyy(目標文件夾)

# 遠程複製
scp -P ssh端口 username@10.10.10.101:/home/username/xxx /home/xxx

# 級聯創建目錄
mkdir -p /xxx/yyy/zzz

# 批量創建文件夾, 會在test,main下都創建java, resources文件夾
mkdir -p src/{test,main}/{java,resources}
比較兩個文件
diff -u 1.txt 2.txt
日誌輸出的字節數, 可以用作性能測試。另外,搜索公衆號頂級 python 後臺回覆 “進階”,獲取一份驚喜禮包。
# 如果做性能測試, 可以每執行一次, 往日誌裏面輸出 “.” , 這樣日誌中的字節數就是實際的性能測試運行的次數, 還可以看見實時速率.
tail -f xxx.log | pv -bt
查看, 去除特殊字符
# 查看特殊字符
cat -v xxx.sh

# 去除特殊字符
sed -i 's/^M//g’ env.sh  去除文件的特殊字符, 比如^M:  需要這樣輸入: ctrl+v+enter
處理因系統原因引起的文件中特殊字符的問題
# 可以轉換爲該系統下的文件格式
cat file.sh > file.sh_bak

# 先將file.sh中文件內容複製下來然後運行, 然後粘貼內容, 最後ctrl + d 保存退出
cat > file1.sh

# 在vim中通過如下設置文件編碼和文件格式
:set fileencodings=utf-8 ,然後 w (存盤)一下即可轉化爲 utf8 格式,
:set fileformat=unix

# 在mac下使用dos2unix進行文件格式化
find . -name "*.sh" | xargs dos2unix
tee, 重定向的同時輸出到屏幕
awk ‘{print $0}’ xxx.log | tee test.log

檢索相關

grep
# 反向匹配, 查找不包含xxx的內容
grep -v xxx

# 排除所有空行
grep -v '^/pre>

# 返回結果 2,則說明第二行是空行
grep -n “^$” 111.txt    

# 查詢以abc開頭的行
grep -n “^abc” 111.txt 

# 同時列出該詞語出現在文章的第幾行
grep 'xxx' -n xxx.log

# 計算一下該字串出現的次數
grep 'xxx' -c xxx.log

# 比對的時候,不計較大小寫的不同
grep 'xxx' -i xxx.log
awk
# 以':' 爲分隔符,如果第五域有user則輸出該行
awk -F ':' '{if ($5 ~ /user/) print $0}' /etc/passwd 

# 統計單個文件中某個字符(串)(中文無效)出現的次數
awk -v RS='character' 'END {print --NR}' xxx.txt
find 檢索命令
# 在目錄下找後綴是.mysql的文件
find /home/eagleye -name '*.mysql' -print

# 會從 /usr 目錄開始往下找,找最近3天之內存取過的文件。
find /usr -atime 3 –print

# 會從 /usr 目錄開始往下找,找最近5天之內修改過的文件。
find /usr -ctime 5 –print

# 會從 /doc 目錄開始往下找,找jacky 的、文件名開頭是 j的文件。  
find /doc -user jacky -name 'j*' –print

# 會從 /doc 目錄開始往下找,找尋文件名是 ja 開頭或者 ma開頭的文件。
find /doc \( -name 'ja*' -o- -name 'ma*' \) –print

#  會從 /doc 目錄開始往下找,找到凡是文件名結尾爲 bak的文件,把它刪除掉。-exec 選項是執行的意思,rm 是刪除命令,{ } 表示文件名,“\;”是規定的命令結尾。 
find /doc -name '*bak' -exec rm {} \;

網絡相關

查看什麼進程使用了該端口
lsof -i:por
獲取本機 ip 地址
/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"
iptables
# 查看iptables狀態
service iptables status

# 要封停一個ip
iptables -I INPUT -s ***.***.***.*** -j DROP

# 要解封一個IP,使用下面這條命令:
iptables -D INPUT -s ***.***.***.*** -j DROP

備註: 參數-I是表示Insert(添加),-D表示Delete(刪除)。後面跟的是規則,INPUT表示入站,***.***.***.***表示要封停的IP,DROP表示放棄連接。

#開啓9090端口的訪問
/sbin/iptables -I INPUT -p tcp --dport 9090 -j ACCEPT 

# 防火牆開啓、關閉、重啓
/etc/init.d/iptables status
/etc/init.d/iptables start
/etc/init.d/iptables stop
/etc/init.d/iptables restart
nc 命令, tcp 調試利器
#給某一個endpoint發送TCP請求,就將data的內容發送到對端
nc 192.168.0.11 8000 < data.txt

#nc可以當做服務器,監聽某個端口號,把某一次請求的內容存儲到received_data裏
nc -l 8000 > received_data

#上邊只監聽一次,如果多次可以加上-k參數
nc -lk 8000
tcpdump
# dump出本機12301端口的tcp包
tcpdump -i em1 tcp port 12301 -s 1500 -w abc.pcap
跟蹤網絡路由路徑
# traceroute默認使用udp方式, 如果是-I則改成icmp方式
traceroute -I www.163.com

# 從ttl第3跳跟蹤
traceroute -M 3 www.163.com  

# 加上端口跟蹤
traceroute -p 8080 192.168.10.11
ss
# 顯示本地打開的所有端口
ss -l 

# 顯示每個進程具體打開的socket
ss -pl 

# 顯示所有tcp socket
ss -t -a 

# 顯示所有的UDP Socekt
ss -u -a 

# 顯示所有已建立的SMTP連接
ss -o state established '( dport = :smtp or sport = :smtp )'  

# 顯示所有已建立的HTTP連接 
ss -o state established '( dport = :http or sport = :http )'  

#找出所有連接X服務器的進程
ss -x src /tmp/.X11-unix/*  

#列出當前socket統計信息
ss -s 

解釋:netstat是遍歷/proc下面每個PID目錄,ss直接讀/proc/net下面的統計信息。所以ss執行的時候消耗資源以及消耗的時間都比netstat少很多
netstat
# 輸出每個ip的連接數,以及總的各個狀態的連接數
netstat -n | awk '/^tcp/ {n=split($(NF-1),array,":");if(n<=2)++S[array[(1)]];else++S[array[(4)]];++s[$NF];++N} END {for(a in S){printf("%-20s %s\n", a, S[a]);++I}printf("%-20s %s\n","TOTAL_IP",I);for(a in s) printf("%-20s %s\n",a, s[a]);printf("%-20s %s\n","TOTAL_LINK",N);}'

# 統計所有連接狀態, 
# CLOSED:無連接是活動的或正在進行
# LISTEN:服務器在等待進入呼叫
# SYN_RECV:一個連接請求已經到達,等待確認
# SYN_SENT:應用已經開始,打開一個連接
# ESTABLISHED:正常數據傳輸狀態
# FIN_WAIT1:應用說它已經完成
# FIN_WAIT2:另一邊已同意釋放
# ITMED_WAIT:等待所有分組死掉
# CLOSING:兩邊同時嘗試關閉
# TIME_WAIT:主動關閉連接一端還沒有等到另一端反饋期間的狀態
# LAST_ACK:等待所有分組死掉
netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'

# 查找較多time_wait連接
netstat -n|grep TIME_WAIT|awk '{print $5}'|sort|uniq -c|sort -rn|head -n20

監控 linux 性能命令

top

按大寫的 F 或 O 鍵,然後按 a-z 可以將進程按照相應的列進行排序, 然後回車。而大寫的 R 鍵可以將當前的排序倒轉。

牛逼啊!接私活必備的 N 個開源項目!趕快
PID 進程id
PPID 父進程id
RUSER Real user name
UID 進程所有者的用戶id
USER 進程所有者的用戶名
GROUP 進程所有者的組名
TTY 啓動進程的終端名。不是從終端啓動的進程則顯示爲 ?
PR 優先級
NI nice值。負值表示高優先級,正值表示低優先級
P 最後使用的CPU,僅在多CPU環境下有意義
%CPU 上次更新到現在的CPU時間佔用百分比
TIME 進程使用的CPU時間總計,單位秒
TIME+ 進程使用的CPU時間總計,單位1/100秒
%MEM 進程使用的物理內存百分比
VIRT 進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES
SWAP 進程使用的虛擬內存中,被換出的大小,單位kb。
RES 進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA
CODE 可執行代碼佔用的物理內存大小,單位kb
DATA 可執行代碼以外的部分(數據段+棧)佔用的物理內存大小,單位kb
SHR 共享內存大小,單位kb
nFLT 頁面錯誤次數
nDRT 最後一次寫入到現在,被修改過的頁面數。
S 進程狀態。D=不可中斷的睡眠狀態,R=運行,S=睡眠,T=跟蹤/停止,Z=殭屍進程
COMMAND 命令名/命令行
WCHAN 若該進程在睡眠,則顯示睡眠中的系統函數名
Flags 任務標誌,參考 sched.h
dmesg, 查看系統日誌
dmesg
iostat, 磁盤 IO 情況監控
iostat -xz 1

# r/s, w/s, rkB/s, wkB/s:分別表示每秒讀寫次數和每秒讀寫數據量(千字節)。讀寫量過大,可能會引起性能問題。
# await:IO操作的平均等待時間,單位是毫秒。這是應用程序在和磁盤交互時,需要消耗的時間,包括IO等待和實際操作的耗時。如果這個數值過大,可能是硬件設備遇到了瓶頸或者出現故障。
# avgqu-sz:向設備發出的請求平均數量。如果這個數值大於1,可能是硬件設備已經飽和(部分前端硬件設備支持並行寫入)。
# %util:設備利用率。這個數值表示設備的繁忙程度,經驗值是如果超過60,可能會影響IO性能(可以參照IO操作平均等待時間)。如果到達100%,說明硬件設備已經飽和。
# 如果顯示的是邏輯設備的數據,那麼設備利用率不代表後端實際的硬件設備已經飽和。值得注意的是,即使IO性能不理想,也不一定意味這應用程序性能會不好,可以利用諸如預讀取、寫緩存等策略提升應用性能。

free, 內存使用情況

free -m

eg:

     total       used       free     shared    buffers     cached
Mem:          1002        769        232          0         62        421
-/+ buffers/cache:          286        715
Swap:          1153          0       1153

第一部分 Mem 行:

total 內存總數: 1002M
used 已經使用的內存數: 769M
free 空閒的內存數: 232M
shared 當前已經廢棄不用,總是0
buffers Buffer 緩存內存數: 62M
cached Page 緩存內存數:421M

關係:total(1002M) = used(769M) + free(232M)

第二部分 (-/+ buffers/cache):

(-buffers/cache) used內存數:286M (指的第一部分Mem行中的used – buffers – cached)
(+buffers/cache) free內存數: 715M (指的第一部分Mem行中的free + buffers + cached)

可見 - buffers/cache 反映的是被程序實實在在喫掉的內存, 而 + buffers/cache 反映的是可以挪用的內存總數.

第三部分是指交換分區

sar, 查看網絡吞吐狀態
# sar命令在這裏可以查看網絡設備的吞吐率。在排查性能問題時,可以通過網絡設備的吞吐量,判斷網絡設備是否已經飽和。

sar -n DEV 1

#
# sar命令在這裏用於查看TCP連接狀態,其中包括:
# active/s:每秒本地發起的TCP連接數,既通過connect調用創建的TCP連接;
# passive/s:每秒遠程發起的TCP連接數,即通過accept調用創建的TCP連接;
# retrans/s:每秒TCP重傳數量;
# TCP連接數可以用來判斷性能問題是否由於建立了過多的連接,進一步可以判斷是主動發起的連接,還是被動接受的連接。TCP重傳可能是因爲網絡環境惡劣,或者服務器壓力過大導致丟包
sar -n TCP,ETCP 1
vmstat, 給定時間監控 CPU 使用率, 內存使用, 虛擬內存交互, IO 讀寫
# 2表示每2秒採集一次狀態信息, 1表示只採集一次(忽略既是一直採集)

vmstat 2 1

eg:
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 0 3499840 315836 3819660 0 0 0 1 2 0 0 0 100 0
0 0 0 3499584 315836 3819660 0 0 0 0 88 158 0 0 100 0
0 0 0 3499708 315836 3819660 0 0 0 2 86 162 0 0 100 0
0 0 0 3499708 315836 3819660 0 0 0 10 81 151 0 0 100 0
1 0 0 3499732 315836 3819660 0 0 0 2 83 154 0 0 100 0
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/GDgb5BHuAgb4JXc3ABBXpA