linux shell 腳本攻略
[TOC]
1.基本概念與特征
基礎
- 雙引號: 引號內可以引用變量,與php相同,如:
echo "${hello} world"
- 使用轉義字符:
echo -e '1\t2'
, 輸出會包含tab符號 - pgrep 根據進程名字查找進程
- 查看正在運行進程的環境變量:
cat /proc/pid/environ | tr '\0' '\n', environ
文件以'\0' 作為分隔符 - 字符串長度: ${#PATH}
- 查看當前使用的bash:
echo $0 或者 echo $SHELL
- root用戶UID為0:
echo $UID
- bash 提示符設置環境變量:
PS1
- 參數個數:
$#
- 參數列表:
$*
或者$@
-
$@
: 解析成 "2" "$3",解析成多個字符,這個比較常用
-
$*
: 解析成 "2c$3", 最好不用,單個字符
-
- 取參數列表的某個幾個值:
*:1:2}, 只獲取前兩個參數
- 命令本身,腳本本身:
$0
數學計算
- 整數簡單計算: let, (()) , [], expr
- 復雜計算,浮點數計算 bc 命令
let
no1=1
no2=2
let result=no1+no2
let no1++
let no1--
let no1+=6
result=$((no1+50))
result=$[ $no1 + 5 ]
result=$[ no1 + no2 ]
浮點數計算
- scale 只對除法會生效,其他運算如果要設置精度,除以1.0
echo "scale=2; 100*9.8111/1.0" | bc
- 進制轉換
echo "obase=10;ibase=2;1100101" | bc
echo "obase=8;16" | bc
echo "obase=2;18" | bc
echo "sqrt(100)" | bc
echo "10^2" | bc
重定向
常用重定向
ls * > ls.txt # 相當于 ls * 1> ls.txt
ls _ * 2> stderr.txt 1>stdout.txt # 相當于 ls _ * &> all.txt
tee
獲取標準輸入,重定向到文件和stdout,會過濾stderr
echo "haha" | tee -a stderr.txt stdout.txt - # 兩個文件都是以追加的方式寫入
文件重定向到命令
cmd < file
重定向腳本內部的文本
cat << EOL > log.txt
a
b
c
d
EOL
文件操作
- 讀取文件
exec 3<input_file.txt
cat <&3 # 相當于 cat <input_file.txt
- 寫入文件
exec 4>output_file.txt
cat "test line" >&4 # 相當于 cat "test line " > output_file.txt
exec 5>>output_file.txt
cat "haha" >&5
數組
普通數組(切片)
var_array=(1 2 3 four five )
inx=3
echo ${var_array[1]}
echo ${var_array[${inx}]}
# 所有的元素
echo ${var_array[*]}
# 數組長度
echo ${#var_array[*]}
# 切片
echo ${var_array[*]:2}
echo ${var_array[*]:2:2} # ${var_array[*]:start:size}
world="1234 56"
echo ${world:2:3} # 34
## 切片負數操作
echo ${world:(-2)} #56
# 打印單個字符
line="hello world"
for word in $line;
do
for((i=0;i<${#word};i++))
do
echo ${word:i:2}
done;
done
# 字符串替換
word=0123456789
echo ${word/23/xx}
關聯數組
條件: bash 4.0+
declare -A map
map=([lmq]=cdz [1]=one)
echo ${map[lmq]} ${map[1]}
echo ${!map[*]} # 打印索引 key
echo ${map[*]} # 打印值 value
alias
- alias vi='vim' # vi 執行的是vim
- 逆別名: \vi # ==> 執行的是 vi 命令
日期操作
獲取日期字符創
- date ==> Sun Aug 6 10:10:07 CST 2017
- 顯示指定格式: date "+ the date: %Y-%m-%d the time:%H:%M:%S"
時間字符串轉化成其他格式
- 獲取時間戳:date --date "Sun Aug 6 10:10:07 CST 2017" +%s
- 周幾: date --date "Sun Aug 6 10:10:07 CST 2017" +%A
調試
兩種方式:
- 顯示命令:
- 顯示命令: set -x or bash -x
- 禁止顯示: set +x or bash +x
- 讀取時顯示輸入: set -v or bash -v
- 讀取時禁止顯示輸入: set +v or bash +v
- 設置環境變量 "_DEBUG", 腳本中判斷"_DEBUG"變量,打印輸出信息
函數
特點:
- 可以遞歸
- 可以export func
- 函數返回值:$?
- $? 相當于 exit code, 只能返回整型,無法接受其他復雜的數據類型
獲取前一個命令的輸出
三種方式:
- 管道: ls | cat -n > out.txt
- 子shell: cmd_output=
cmd_output
-
$()
是在子shell中進行操作,不會影響父shell的環境, -
"$()"
在獲取子shell中的文本時,一定要加上雙引號,否則會子shell會自動刪除 '\n', 雙引號保留 '\n'
-
- 反引用: output=
ls | cat -n
; echo $output
IFS
一般IFS與for結合使用,IFS(interval field separator)定義分隔符,for 迭代處理
#!/bin/bash
#Desc: Illustration of IFS
line="root:x:0:0:root:/root:/bin/bash"
oldIFS=$IFS;
IFS=":"
count=0
for item in $line;
do
[ $count -eq 0 ] && user=$item;
[ $count -eq 6 ] && shell=$item;
let count++
done;
IFS=$oldIFS
echo $user\'s shell is $shell;
循環
更多參考:https://billie66.github.io/TLCL/book/zh/chap34.html
for 循環
- demo
IFS=" ";
for var in "hello" "lmq";
do
echo $var;
done;
# hello lmq 迭代失敗
for var in "hello lmq";
do
echo $var;
done;
str="hello lmq"
# hello\nlmq
for var in $str;
do
echo $var;
done;
array=(hello lmq)
for var in ${array[@]};
do
echo $var;
done;
- for序列
for i in {0..2};
do
echo $i
done
for i in {a..z};
do
echo $i
done
for i in {A..C};
do
echo $i
done
- for C語言格式
for ((i=0;i<10;i++))
{
echo $i
}
while 循環
while condition
do
cmds;
done
until 循環
x=0
until [ $x -eq 9 ];
do
let x++;
echo $x;
done
邏輯判斷
更多參考:http://blog.csdn.net/ithomer/article/details/6836382
if...elif...else
if condition;
then
cmds;
elif condition;
then
cmds;
else
cmds;
fi
邏輯運算符||與&&
-
[ condition ] && cmd
; # condition 為true 執行cmd -
[ condition ] || cmd
; # condition 為false 執行cmd
算術比較
[ $var -ne 0]
-
[ $var -ge 0 -a $var1 -ge 2]
# 邏輯與 -
[ $var -ge 0 -o $var1 -ge 2]
# 邏輯或
字符串比較
單中括號比較字符串偶爾會出錯,推薦使用雙中括號
[[ $str1 == $str2 ]]
-
[[ -n $str1 ]]
字符串是否非空 -
[[ -z $str1 ]]
字符串是否為空
2.常用命令
cat
- 合并多個輸入:
echo "this is test" | cat - stdout.txt stderr.txt >> all.txt
- 壓縮空行:
cat -s file
-
cat file | tr -s '\n'
將多個\n
壓縮成單個\n
- 制表符顯示為
^I
: cat -T file.py- vim 配置
set expandtab
關閉tab功能
- vim 配置
- 行號:cat -n file
find
find ./ -name "*.txt"
find ./ -iname "case.sh"
- 或條件搜索:
find ./ -name "*.txt" -o -name "*.sh"
- 匹配路徑搜索:
find ./ -name "*.bin" -path "*build*"
- 正則表達式:
find ./ -iregex ".*\(\.session\|\.txt\)"
find ./ -iregex ".*t[xs]t"
- 否定:
find . ! -name "*.txt"
- 只查找當前目錄, 注意 參數
-mindepth
與參數-maxdepth
盡可能在所有的參數前面:find . -maxdepth 1 -type f
find . -mindepth 2 -maxdepth 3 -name "*.py"
- 查找不同類型的文件:
find . -maxdepth 1 -type d
find . -type fd
-
find . -type fdlcbsp
s:socket p:fifo b:block
- 根據文件時間進行搜索:
- 訪問時間-atime(單位:天,指的是差值,上一次訪問與當前時間的差值,差值越大,時間越早): 用戶最近一次訪問時間;文件的 Access time,atime 是在讀取文件或者執行文件時更改的.
-
find . -type f -atime -1
小于1天內被訪問過的文件
-
- 修改時間-mtime(單位:天): 文件內容最后一次修改的時間; 文件的 Modified time,mtime 是在寫入文件時隨文件內容的更改而更改的
-
find . -type f -mtime 1
昨天修改的文件
-
- 變化時間-ctime(單位:天):文件元數據(metadata, 權限,所有權)最后一次修改的時間; 在寫入文件、更改所有者、權限或鏈接設置時隨 Inode 的內容更改而更改的。
- amin (單位:分)
-
find . -type -amin +7
7分鐘之前訪問的文件
-
- mmin
- cmin
- anewer
- cnewer
- mnewer
- newer file 最新的文件
- 訪問時間-atime(單位:天,指的是差值,上一次訪問與當前時間的差值,差值越大,時間越早): 用戶最近一次訪問時間;文件的 Access time,atime 是在讀取文件或者執行文件時更改的.
- 根據文件大小搜索:
-
find . -type f -size +2k
大于兩K的文件 -
find . -maxdepth 1 -type d -exec ls -dl {} \;
目錄不能根據大小排序,都是4k
-
- 刪除找到的文件:
find . -type f -name "*.swp" -delete
- 基于文件權限查找:
find . -type f -perm 644
-
find . -type f -name "*.php" ! -perm 644
找出沒有可讀權限的php文件 -
find . -user cdz
根據用戶查找
- 找到后執行命令:
-
find . -type f -perm 644 -exec ls -l {} \; > /Users/cdz/tmp/all.txt
注意\;
分號代表exec結束,后面可以添加其他操作 find . -type f -perm 644 -exec ls -l {} \;
-
find . -type f -perm 644 -ok ls -l {} \;
詢問是否要執行。y執行,直接回車不執行 -
find . -name "sub" -prune -o -type f
排除sub目錄 -
find . \( -name "sub" -o -name "sub1" \) -prune -o -type f
排除兩個目錄
-
ls
- 顯示訪問時間:
ll --time=atime
- 根據訪問時間排序:
ll --time=atime -rt
最新訪問的在最底部
- 根據訪問時間排序:
- 顯示最近更新文件內容的時間:
ll
- 根據最新的文件修改時間排序:
ll -rt
- 根據最新的文件修改時間排序:
xargs
命令行接受參數的兩種形式:
- 以標準輸入的形式接受數據,即管道
- 以命令行參數的形式接受數據, 即xargs
-
ls *.txt | cat
輸出的是匹配到的文件,如stdout.txt, stderr.txt -
ls *.txt | xargs cat
輸出的stdout.txt和stderr.txt的文件內容 - 多行轉單行:
ls *.txt | xargs
- 單行劃分成多行:
ls *.txt | xargs -n 2
, 假設有:s1.txt stdout.txt, stderr.txt, 輸出:
s1.txt stderr.txt
stdout.txt
- 使用分隔符:
-
echo "1:2:3:4" | xargs -d ':' | xargs
分出的數據中包含一個換行符,不懂為什么,再使用xargs 去除 echo "stderr.txt:stdout.txt" | xargs -d : | xargs cat
-
- 參數分組執行:
ls *.txt | xargs -n 2 cat
, 每次調用cat 輸出兩個文件的內容,第一次輸出 s1.txt和stderr.txt文件內容,第二次輸出 stdout.txt 文件內容 - 參數二次加工,比如字符串格式化, 類似于find -exec :
echo "stderr.txt:stdout.txt" | xargs -d : | xargs -n 1 | xargs -I placeholder echo "hello placeholder"
-
xargs -n
限制命令執行幾次,順便出去換行
-
- find與xargs:
- 錯誤:
find . type f -name "*.txt" | xargs rm -f
如果文件中含空格文件,會錯誤刪除,xargs的IFS分割符默認是空格和換行。 - 正確:
find . type f -name "*.txt" -print0 | xargs -0 rm -f
- 錯誤:
- 統計代碼文件行數:
find . -type f -name "*.py" -print0 | xargs -0 wc -l
tr
原理: tr set1 set2 , 從標準輸入獲取數據,根據set1 set
2 映射規則轉換成新數據
- 小寫轉化成大寫:
echo "hello world" | tr "a-z" "A-Z"
# HELLO WORLD - set2 元素比較少時,末尾補齊:
echo "hello world" | tr "a-z" "A-O"
# 結果HELLO OOOLD
- set1 元素比較少時,一set1為準,set2多出的部分,不轉換:
echo "hello world" | tr "a-o" "A-Z"
#HELLO wOrLD
- 刪除字符串:
echo "hello world" | tr -d 'a-e'
- 縮減字符串:
echo "hello wwwwwwworld" | tr -s ' w'
# hello world - 字符串替換:
echo "hello world" | tr 'w' 'W'
- 刪除不在補集中的字符串:
echo "hello 1 ww 2 world" | tr -d -c "1-3"
- 刪除重復的字符:
tr -s '\n'
檢驗 md5sum和shasum
- md5 & shaxsum
# md5sum
? ~ md5sum *.txt > all.md5
? ~ md5sum -c all.md5
a.txt: OK
b.txt: OK
stderr.txt: OK
stdout.txt: OK
# sha1
? ~ sha1sum -c all.sha1
a.txt: OK
b.txt: OK
stderr.txt: OK
stdout.txt: OK
- md5deep & shaxdeep 需要額外安裝
- 使用find 結合使用:
find . -type f -print0 | xargs -0 md5sum >> all.md5
- 使用find 結合使用:
臨時文件
temp_file="/tmp/var.$$"
echo ${temp_file}
分割文件 split & csplit
#todo
獲取文件名和擴展名
原理,使用 %%
,%
, ##
,#
刪除字符:
-
%%
: 從右邊開始刪除到%%位置,貪婪模式 -
%
非貪婪模式 -
##
,#
與%
相反,原理相同
file="test.backup.jpg"
echo file name: ${file%.*}
echo file name: ${file%%.*}
echo suffix name: ${file#*.}
echo suffix name: ${file##*.}
# 輸出
file name: test.backup
file name: test
suffix name: backup.jpg
suffix name: jpg
自動化交互
#!/bin/bash
#Filename: interactive.sh
read -p "Enter number:" no ;
read -p "Enter name:" name
echo You have entered $no, $name;%
3.文件相關
生成任意文件大小
-
dd if=/dev/zero of=junk.data bs=1M count=3
: 生成3M的junk.data文件
comm 文本文件的交集與差集
- 對比兩個文件:
comm a.txt b.txt
, 第一列: 只在a文件出現的行,第二列只在b文件出現的行,第三列在ab文件中出現的行 - 只看a文件出現的行:
comm a.txt b.txt -1
- 只看b文件出現的行:
comm a.txt b.txt -2
文件權限、所有權和黏置位
目錄權限說明
- r: 具有讀取目錄結構的權限,ls 可以讀取文件夾中的列表
- w: 可以在目錄內執行寫操作,比如創建文件,刪除,修改文件名
- x:能否進入目錄,如果要有讀取該目錄內代碼的文件,必須要有x權限,設置web服務器時,要注意。
權限修改
chown -R user.group filename
chmod u=rwx g=rw o=r finename
- setuid 只能針對linux可執行的二進制文件,不能用于腳本
touch
- 修改訪問時間:
touch -a junk.data
- 修改更新時間:
touch -c junk.data
- 指定時間修改:
touch -d time_str junk.data
, 默認修改mtime
超鏈接
- 格式: ln -s /usr/local/bin/python2.7 /usr/bin/python2.7
- 必須全部是絕對路徑
head 與tail
- tail -n +6 從第六行開始打印
- head -n -6 打印到倒數第六行
- tail -s 3 -f file, 3秒查詢一次
只列出目錄
- 最好使用:
ls -Fl | grep "/$"
, 不包含.和..
ls -l | grep "^d"
-
ls -dl */
, 不包含.和..
, 末尾多加一個斜杠 -
find . -maxdepth 1 -type d -print
, 包含.
wc 統計字符數
wc -l file
cat file | wc -w
-
echo "haha" | wc -c
# 長度為5 -
wc file
統計行數,單詞數,字數 -
wc file -L
打印最長行的長度
tree
tree beautyme-crawler
-
tree . -P "*.sh"
只列出葉子是.sh的文件,目錄但是不包含.sh的文件也會顯示 -
tree . -I "*.sh"
-P 的逆過程,顯示非*.sh 文件 -
tree beautyme-crawler -H beautyme-crawler -o out.html
瀏覽器打開out.html可以通過out.html查看所有的文件
4.文本處理
正則表達式
pattern | 解釋 | ||
---|---|---|---|
. |
大部分字符,不包含特殊字符,比如 \n, 真正的任意字符 [\S\s]
|
||
? | 匹配之前[0, 1] | ||
+ | 匹配之前[1, ∞] | ||
* | 匹配之前[0, ∞] | ||
9[^10] | 匹配93,95,9a, 不匹配 91,92 | ||
` | ` | 匹配兩邊任意一個, Oct (1st | 2nd) |
() |
創建一個用于匹配的子串,如ma(tri)? 匹配max或matrix | ||
\b |
單詞邊界, \bcool\b匹配cool,不匹配coolant | ||
\B |
非單詞邊界, cool\B 匹配coolant,不匹配cool | ||
\w |
單個單詞字符,字母,數字與_, 不匹配空白符(回車,空格, &,等其他特殊字符) | ||
\W |
單個非單詞字符 |
通配符與正則表達式區別
http://blog.csdn.net/huiguixian/article/details/6284834
ls *.md5
ls [ab].md5
ls [^b].md5
ls [a]*.md5
ls ?.md5
grep
- 只顯示匹配到的部分,-o:
grep -o "http://101.68.80.186.*?>" server.log | grep -o ".*?[^>]"
- 統計匹配到的字符串的行數,不是匹配出現的次數:
grep -c "101.68.80.186" server.log
相當于grep "101.68.80.186" server.log | wc -l
- 統計出現的次數:
grep -o "101.68.80.186" server.log | wc -l
- 輸出所在的行數:
grep -on "101.68.80.186" server.log
- 如果匹配多個文本,查找pattern在哪個文件中:
grep -l "101.68.80.186" serve*.log
得到的結果是文件名,假設是server.log,則代表"101.68.80.186"在server.log中能找到 -
-L
與-l
相反 - 遞歸:
-
grep "function()" . -R -n
,軟連接也搜索 -
grep "function()" . -r -n
, 排除軟連接,如果命令行中提供了軟連接,也會進行搜索
-
- 忽略大小寫:
grep -i "error" server.log
- 多個正則表達式:
grep -in -e "error" -e "warn" server.log
- pattern_file:
grep -f pattern_file server.log
- 包含文件:
grep "wechat" . -r --include *.py
- 排除文件:
-
--exclude
:grep "wechat" . -r --include *.py --exclude "start_wechat_article.py"
--exclude-from file
-
- 與xargs -0配合使用:
grep -lZ "test" file | xargs -0 rm
- 靜默輸出,返回值在:
$?
, 為0代表匹配到 - 打印匹配到的前后幾行
-
seq 10 | grep 5 -A 3
, 之后 -
seq 10 | grep 5 -B 3
, 之前 -
seq 10 | grep 5 -C 3
, 前后三行
-
cut 按列截取數據
-
cut -f 1 -d ':' a.md5
指定分隔符 -
cut -f 2,3 filename
: 截取2,3列 -
cut --complement -f 1 filename
取反,顯示除了第一列之外的所有列 - 根據長度切割:
-
cut -c1-5 a.md5
, 截取前5個 -
cut -c-5 a.md5
,截取前5個 -
cut -c5- a.md5
,截取第5個到行尾 -
cut -c2 a.md5
,截取第二個字符 -
cut -c1-5,10-19 a.md5 --output-delimiter='|'
,截取多個列,指定輸出定界符
-
sed
-
sed 's/60/xx/g' a.md5 > newa.md5
, 替換并保存到新文件 -
sed -i 's/60/xx/g' a.md5
,更新到原文件 -
sed -i.bak 's/60/xx/g' a.md5
,更新原文件,并生成a.md5.bak備份原文件 -
echo 'this this this this' | sed 's/this/new/4g'
# this this this new 修改第幾個出現的位置,下標從1開始-
echo 'this this this this' | sed 's:this:new:4g'
: 作為定界符 -
echo 'this this this this' | sed 's|this|new|4g'
| 作為定界符
-
-
sed '/^$/d' a.md5
,刪除空行 -
echo this is a example | sed 's/\w\+/[&]/g'
,使用已經匹配的字符串標記 &, 注意正則的符號前面需要\
- 正則表達式中的子分組同樣適用:
\1, \2
eg
- mac下替換字符串(mac -i必須指定后綴)
find . -name "settings.py" -exec sed -i.bak 's/proxy.abuyun.com/http-pro.abuyun.com/g' {} \;
- 刪除備份文件:
find . -name "settings.py.bak" -exec rm -fr {} \;
- 刪除備份文件:
awk
docs: https://coolshell.cn/articles/9070.html
原理: awk -F : 'BEGIN{print "begin block"} PATTERN { execute cmds per line } END{print "end block" }' a.md5
-
awk -F : 'BEGIN{print "begin block"} NR<3 {print "number of fields: "NF " commemt: " $2} END{print "end block" }' a.md5
, -F 指定分隔符 -
awk -F : 'BEGIN{print "begin block", v1} NR<3 {print "number of fields: "NF " commemt: " $2, v1} END{print "end block "}' v1="hello" a.md5
, 傳遞變量,注意在BEGIN語句塊中v1無效, 不懂為什么。 -
seq 10 | awk '{getline;print}'
getline 獲取,具體參考docs awk 'BEGIN{ "date" | getline date; print date; }'
-
echo | awk '{"grep root /etc/passwd"| getline cmdout; print cmdout}'
,通過getline 將外部的shell命令的輸出讀入變量 cmdout, -
seq 10 | awk 'NR==1, NR==3'
打印1到3行 -
seq 10 | awk '/1/, /3/'
打印start_pattern與end_pattern之間的行 -
seq 10 | awk '/[1-3]/, /4/'
pattern 支持正則,但是支持的樣式有限,有哪些限制未知,最好避開這個問題,不能使用\d
,用[[:digit:]]
替代 -
awk 'NR<=3' filename
模擬head命令
tac
-
echo "hello\nworld" | tac
# world\nhello 逆序形式打印行
5.網路
wget
wget url1 url2
-
wget -t 5 -O filename -o wget.log url
-t 重試五次, -O 指定文件名, -o指定日志文件 -
wget -c url
下載中斷續傳
curl
-
curl url > index.html
默認是將結果輸出到終端 -
curl -O url1 url2
路徑中必須包含文件名 -
curl -o filename url
指定文件名 -
curl --progress https://www.taobao.com > taobao.html
顯示下載進度 -
curl -c https://example.com
斷點續傳 -
curl -I https://www.taobao.com
只下查看部信息 curl --referer "http://www.baidu.com" --cookie "user=baidu;pass=bitch" --user-agent "chrome" -H "Host: www.baidu.com" -H "Accept-Language: en" https://www.taobao.com
curl -u user[:pass] https://www.taobao.com
curl -d "key1=val1&key2=val2" https://post.example.com
6.綜合使用的例子
tar
-
tar -cvvf md5.tar a.md5 b.md5/ tar -cvf md5.tar a.md5 b.md5
歸檔文件,vv 與v,相當于ls -l
與ls
的區別 -
tar -rvf md5.tar a.md5.bak
追加文件 -
tar -tvvf map_poi-v1.0.0.tar.gz
查看歸檔文件 -
tar -df md5.tar a.md5
對比歸檔文件 -
tar -uvvf md5.tar a.md5
更新歸檔文件 -
tar -f md5.tar --delete a.md5.bak
刪除歸檔文件 -
tar -xvvf md5.tar a.md5 -C path_extract_dir
提取指定文件,到指定目錄 -
tar -cf all.tar.gz --exclude "*.tar.gz" *
歸檔排除指定模式的文件,注意雙引號 -
tar -cf - a.md5 b.md5 | tar -tf -
tar與stdin,stdout
gzip gunzip
gzip只能壓縮單文件,與tar歸檔后,再組合使用。
-
gzip -9 test.img
最高壓縮比例壓縮文件,壓縮后刪除源文件。 -9 耗時 -
gunzip test.img.gz
解壓 -
zcat test.txt.gz
直接打印gz壓縮文件 -
tar -cavvf archive.tar.gz file1 file2
根據后綴名判斷壓縮格式 -
cat iter.sh| gzip -c > iter.sh.gz
壓縮后不刪除源文件, -c 輸出到stdout
bzip2 bunzip2
壓縮比率比gzip更高,用法同gzip
-
bzip2 -9 -k test.img
保留文件
lzma unlzma
壓縮比率更高,用法同bzip2
-
tar --lzma -cvvf all.md5.lzma *.md5.*
創建 -
tar --lzma -tvvf all.md5.lzma
查看
zip,unzip
注意與gzip的區別
-
zip -r map_poi.zip map_poi
一定要-r
,不然目錄不會遞歸壓縮 -
unzip -o map_poi.zip
解壓縮不詢問 -
zip map_poi.zip -u zip.txt
增加或者更新文件 -
zip -d map_poi.zip zip.txt
刪除文件 -
unzip -l map_poi.zip
列出文件
base64
-
base64 a.md5 > a.md5.64
編碼 -
cat a.md5 | base64 > a.md5.64
編碼 -
base64 -d < a.md5.64
解碼 -
cat a.md5.64 | base64 -d
解碼
7. 網絡進階
ifconfig & iwconfig(無線配置)
-
ifconfig wlan0 192.168.0.80 netmask 255.255.252.0
設置ip地址 -
ifconfig eth0 hw ether 18:65:90:cc:39:49
設置mac地址,可以進行硬件地址欺騙 -
echo "nameserver 8.8.8.8" | sudo tee -a /etc/resolv.conf
設置dns -
route add default gw 192.168.0.1 wlan0
設置網關 -
iwlist scan
搜索網絡
host & nslookup
host baidu.com
-
nslookup baidu.com
推薦使用這個命令 - 設置dns,直接修改
/etc/hosts
文件
ping
-
ping baidu.com -c 2
-
rtt min/avg/max/mdev = 1.709/1.752/1.795/0.043 ms
rtt(Round Trip Time) 往返時間, mdev 代表平均偏差 -
-c
發送兩個 - 失敗
$?
不為0
-
fping
-
fping -a -u -g 192.168.135.1/24
-g 生成ip地址列表, -a show system alive, -u unreachable
ssh
-
ssh -p 34185 cdz@hostname "cat >> ~/.ssh/authorized_keys" < ~/.ssh/id_rsa.pub
添加免登陸的公鑰。本地stout 傳輸給遠端的 stdin -
ssh cdz@host 'cmd1;cmd2;'
命令根據使用情況決定使用單引號,還是雙引號 -
echo "cmd1;cmd2" | ssh cdz@host
可以通過使用管道的形式傳命令 -
echo "text" | cdz@host 'cat >> list'
本地數據重定向到遠程stdin
du
-
du -sh dir
顯示整個目錄占用的空間大小 -
du -ah dir
遞歸顯示整個子目錄 -
du -ch *.txt
顯示匹配的文件占用空間,最后一行輸出當前文件夾的total大小 -
du -hs py
統計整個文件夾大小 -
du --exclude "junk.data" * -ch
排除文件 -
du -x /dev/sda1
對于掛載點,必須使用-x
避免深入遍歷 -
du -ak py | sort -nrk 1 | head
目錄中最大的十個文件或目錄 -
find py -type f -exec du -k {} \; | sort -nrk 1 | head
最大的十個文件
/usr/bin/time & time
shell 默認內建有個time命令,系統有個/usr/bin/time命令,第二個命令更強大,能獲取的信息更多,支持通過制定的format輸出
/usr/bin/time -f "cmd: %C wall time: %E cpu time(user + system): %P exit code: %x " ls 1> cmd_output.txt
time ls
/usr/bin/time ls
8.系統信息查看
who & w & users
- w - Show who is logged on and what they are doing.
- who - show who is logged on
- users print the user names of users currently logged in to
the current host -
users | tr ' ' '\n' | uniq
, 多個終端統一用戶,也會出現多個
uptime
查看系統啟動了多長時間
last & lastba
last查看系統登錄日志信息, lastb 查看系統用戶登錄的失敗信息,root用戶才能有權限查看
-
last | head
查看最近的十條登錄信息 -
last user | head
獲取某個用戶會話
watch
默認定時2兩秒執行某個命令,觀察輸出
-
watch -n 5 -d 'ls -l'
五秒執行一次,-d強調差異
ps
-
ps -C Xvfb
查看特定進程名的進程信息 -
ps -C Xvfb -o pid=
獲取pid, 用處不大,一般很難定位進程名 -
ps -eo pid,command | grep start_presslogic | grep -v grep
定制輸出列 -
ps -ef | grep "start_presslogic|PID" | grep -v grep
顯示父進程 ps -eo pid,command e | grep start_presslogic | grep -v grep
kill
常用的信號:
- SIGHUP 1 對進程或終端進行掛起檢測
- SIGNINT 2 ctrl + c 信號
- SIGKILL 9 強制殺死進程
- SIGTERM 15 默認終止進程
- SIGTSTP 20 CTRL + Z 信號
使用:
kill -9 12333
kill -s SIGKILL 12333
which & whereis & file & whatis
- which ls 查找命令位置
- whereis ls 命令位置和源碼所在的位置
- file 判斷文件類型
- whatis 查看簡要功能信息
cpu 信息
cat /proc/cpuinfo
內存信息
cat /proc/meminfo
分區信息
cat /proc/partitions
/proc/pid 正在執行程序的一些信息
├── attr
│ ├── current
│ ├── exec
│ ├── fscreate
│ ├── keycreate
│ ├── prev
│ └── sockcreate
├── autogroup
├── auxv
├── cgroup
├── clear_refs
├── cmdline
├── comm
├── coredump_filter
├── cpuset
├── cwd -> [Error reading symbolic link information]
├── environ
├── exe -> [Error reading symbolic link information]
├── fd [error opening dir]
├── fdinfo [error opening dir]
├── io
├── limits
├── loginuid
├── maps
├── mem
├── mountinfo
├── mounts
├── mountstats
├── net
│ ├── arp
│ ├── bonding
│ │ └── bond0
│ ├── connector
│ ├── dev
│ ├── dev_mcast
│ ├── icmp
│ ├── igmp
│ ├── ip_mr_cache
│ ├── ip_mr_vif
│ ├── mcfilter
│ ├── netfilter
│ │ ├── nf_log
│ │ └── nf_queue
│ ├── netlink
│ ├── netstat
│ ├── packet
│ ├── protocols
│ ├── psched
│ ├── ptype
│ ├── raw
│ ├── route
│ ├── rt_acct
│ ├── rt_cache
│ ├── snmp
│ ├── sockstat
│ ├── softnet_stat
│ ├── stat
│ │ ├── arp_cache
│ │ └── rt_cache
│ ├── tcp
│ ├── udp
│ ├── udplite
│ ├── unix
│ ├── vlan
│ │ └── config
│ ├── wireless
│ └── xfrm_stat
├── ns [error opening dir]
├── numa_maps
├── oom_adj
├── oom_score
├── oom_score_adj
├── pagemap
├── personality
├── root -> [Error reading symbolic link information]
├── sched
├── schedstat
├── sessionid
├── smaps
├── stack
├── stat
├── statm
├── status
├── syscall
├── task
│ └── 1989
│ ├── attr
│ │ ├── current
│ │ ├── exec
│ │ ├── fscreate
│ │ ├── keycreate
│ │ ├── prev
│ │ └── sockcreate
│ ├── auxv
│ ├── cgroup
│ ├── clear_refs
│ ├── cmdline
│ ├── comm
│ ├── cpuset
│ ├── cwd -> [Error reading symbolic link information]
│ ├── environ
│ ├── exe -> [Error reading symbolic link information]
│ ├── fd [error opening dir]
│ ├── fdinfo [error opening dir]
│ ├── io
│ ├── limits
│ ├── loginuid
│ ├── maps
│ ├── mem
│ ├── mountinfo
│ ├── mounts
│ ├── ns [error opening dir]
│ ├── numa_maps
│ ├── oom_adj
│ ├── oom_score
│ ├── oom_score_adj
│ ├── pagemap
│ ├── personality
│ ├── root -> [Error reading symbolic link information]
│ ├── sched
│ ├── schedstat
│ ├── sessionid
│ ├── smaps
│ ├── stack
│ ├── stat
│ ├── statm
│ ├── status
│ ├── syscall
│ └── wchan
└── wchan