linux shell 腳本攻略

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
  • 參數個數: $#
  • 參數列表: $*或者 $@
    • $@: 解析成 "1" "2" "$3",解析成多個字符,這個比較常用
    • $*: 解析成 "1c2c$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=(ls | cat -n); echocmd_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功能
  • 行號: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 最新的文件
  • 根據文件大小搜索:
    • 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

臨時文件

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 -lls 的區別
  • 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
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 第1章 小試牛刀 $ 是普通用戶,# 表示管理員用戶 root。 shebang:#!。sharp / hash ...
    巴喬書摘閱讀 6,399評論 1 4
  • 1.cat的使用 1.1 cat拼接,拼接多個文件 cat file1 file2 file3 ... 1.2st...
    PeterGu閱讀 882評論 0 0
  • 1、數學運算 在Bash shell環境中,可以使用let、(())和[]執行基本的算術操作,而在進行高級操作時,...
    ruready閱讀 243評論 0 0
  • 1.獲取字符串長度 # = 之間沒有空格 tom=peter echo $(#tom) 2.獲取當前所使用的she...
    PeterGu閱讀 899評論 0 0
  • 我來自青島,青島離海很近,海邊總是會有一群海鷗。我從小就喜歡海鷗,海鷗的姿態很美??墒牵铱偛荒莛B一只海鷗呀,我決...
    畫彩仙靈閱讀 1,245評論 5 4