Linux shell速查手冊

Linux Shell腳本攻略筆記[速查]

Linux Shell腳本攻略的筆記,markdown編寫,能夠速查(ctrl+f)html

2013-09-08 從歷史網摘中補充 2014-02-16 增長<<shell腳本指南>>筆記補充java


資源

sed簡明教程linux

awk簡明教程git


shell script

#!/bin/bash
# do something

run shell script

sh script.sh

or

chmod a+x script.sh
./script.sh
# 會讀取首行的解釋器, 執行

cmdgithub

cmd1; cmd2

or

cmd1
cmd2

echo

echo 的功能正如其名,就是基於標準輸出打印一段文本web

echo "welcome to bash"
echo welcome to bash

使用不帶引號的echo時,沒法顯示分號正則表達式

使用單引號echo時,bash不會對單引號中變量求值 '$var'算法

echo 中轉義換行符shell

默認狀況,echo將換行標誌追加到文本尾部,能夠忽略結尾換行符apache

echo -n 'test\n'

對字符串進行轉義

echo -e '1\t2\t3'

打印彩色輸出

文字顏色碼
    重置0
    黑色30
    紅色31
    綠色32
    黃色33
    藍色34
    洋紅35
    青色36
    白色37

echo -e "\e[1;31m This is red test \e[0m"

背景顏色碼
    重置0
    黑色40
    紅色41
    綠色42
    黃色43
    藍色44
    洋紅45
    青色46
    白色47

echo -e "\e[1;42m Green Background \e[0m"

printf

能夠格式化字符串, 使用參數同c中printf同樣

printf "hello world"

默認不會加換行符, 須要手動添加

printf "%-5s %-10s %-4.2f\n" 3 Jeff 77.564

3    Jeff      77.56

環境變量和變量

bash中,每一個變量的值都是字符串,不管你給變量賦值時是否使用引號,值都會以字符串的形式存儲

環境變量

查看全部與此終端進程相關的環境變量

env

查看某個進程的環境變量

cat /proc/$PID/environ

變量賦值

var=value
var='the value'
var="the $PARAM"

echo $var
echo ${var}

var = value非變量賦值是相等操做

環境變量

未在當前進程中定義,而是從父進程中繼承而來的變量
export 設置環境變量,以後,從當前shell 執行的任何程序都會繼承這個變量

export PYTHONPATH=$PYTHONPATH:/home/ken/workspace

經常使用的環境變量

PATH 查找可執行文件路徑, 一般定義在/etc/environment or /ect/profile or ~/.bashrc
修改:        export PATH=$PATH:/new/path/
HOME
PWD
USER
UID
SHELL

獲取字符串長度

length=${#var}

識別當前shell版本

echo $SHELL
    /bin/bash
echo $0
    bash

檢查是否爲超級用戶 or 普通用戶

root的UID=0

if [ $UID -ne 0 ]
then
    echo "not root user"
else
    echo "root"
fi

修改bash的提示字符

設置PS1變量
\u用戶名
\h主機名
\w當前工做目錄

pgrep

獲取某個進程名對應進程id

pgrep gedit

shell數學運算

整數運算

let

no1=4
no2=5
let result=no1+no2

let no1++
let no2--
let no1+=7
let no2-=7

expr(少用)

result=`expr 3 + 4`
result=$(expr $no1 + 5)

其餘方法

result=$[ no1 + no2 ]
result=$[ $no + 5 ]

result=$(( no1 + 5 ))

浮點數

echo "4 * 0.56" | bc
設定精度
echo "scale=2;3/8" | bc
進制轉換
echo "obase=2;100" | bc
平方
echo "10^10" | bc
平方根
echo "sqrt(100)" | bc

命令狀態

當命令成功完成, 返回0

發生錯誤並退回, 返回非0

能夠從$?中獲取 cmd; echo $?

文件描述符和重定向

文件描述符: 與文件輸入/輸出相關聯的整數, 用來跟蹤已打開的文件

0 stdin  標磚輸入
1 stdout 標準輸出
2 stderr 標準錯誤

重定向到文件

清空文件寫入新內容
echo "test" > temp.txt
追加
echo "test" >> temp.txt

>等價於1>
>>等價於 1>>

輸出分離或合併

分離
cmd 2>stderr.txt  1>stdout.txt

合併
cmd > output.txt 2>&1
or
cmd &> output.txt

扔到垃圾桶

/dev/null 特殊設備文件, 接收到的任何數據都會被丟棄(位桶/黑洞)

只有標準錯誤
cmd 2 > /dev/null

標準輸出和標準錯誤
cmd >/dev/null 2>&1

同時輸出到終端和文件

cmd | tee file1

tee默認覆蓋,能夠-a選項追加
cmd | tee -a file1

將stdin做爲命令參數

cmd1 | cmd2 | cmd3 -

將文件重定向到命令

cmd < file

自定義文件描述符

使用文件描述符3打開並讀取文件
exec 3<input.txt
cat <&3

使用文件描述符4進行寫入
exec 4>output.txt
echo newline >&4

cat

cat, concatenate(拼接)

「cat」表明了連結(Concatenation),鏈接兩個或者更多文本文件或者以標準輸出形式打印文件的內容

通常格式

cat file1 file2 file3

從管道中讀取
OUTPUT_FROM_SOME_CMDS | cat

echo "test" | cat - file1

壓縮空白行, 多個連續空行變成單個

cat -s  file

配合tr移除空白行

cat file | tr -s '\n' #連續多個\n -> \n

加行號

cat -n file

顯示製表符等

cat -T file

cat f > t
注意:「>>」和「>」調用了追加符號。它們用來追加到文件裏,而不是顯示在標準輸出上。
「>」符號會刪除已存在的文件,而後建立一個新的文件。
因此由於安全的緣由,建議使用「>>」,它會寫入到文件中,而不是覆蓋或者刪除。

輸入多行文字(CTRL + d 退出)

cat > test.txt

數組和關聯數組

普通數組,整數做爲數組索引, 藉助索引將多個獨立的數據存儲爲一個集合(list)

關聯數組,可使用字符串做爲索引(map)

數組

定義

array_var=(1 2 3 4 5)

or
array_var[0]="test1"
array_var[3]="test3"

讀取

echo ${array_var[0]}

以清單形式打印

echo ${array_var[*]}
echo ${array_var[@]}

長度

echo ${#array_var[*]}

獲取索引列表

echo ${!array_var[*]}

關聯數組

declare -A ass_array

內嵌索引-值
ass_array=([index1]=value1 [index2]=value2)

獨立
ass_array[index3]=value3

echo ${ass_array[index1]}

alias

alias是一個系統自建的shell命令,容許你爲名字比較長的或者常用的命令指定別名。

alias new_command='command seq'
unalias new_command

使用原生命令
\new_command

date

「date」命令使用標準的輸出打印當前的日期和時間,也能夠深刻設置

讀取日期

date

時間戳

date +%s

日期轉換爲時間戳

date --date "Thu Nov 18 08:07:21 IST 2010" +%s

日期格式化

星期  %a  Sat
      %A  Saturday
月    %b  Nov
      %B  November
日    %d  31
固定日期格式mm/dd/yy     %D
年    %y  10
      %Y  2010
小時  %I/%H    08
分鐘  %M  33
秒    %S  10
納秒  %N  696308515
Unix紀元時  %s

格式化

date "+%Y %B %d"

date +%Y-%m-%d
輸出: 2011-07-28
date +"%Y-%m-%d %H:%M:%S"

設置日期和時間

date -s "格式化日期字符串"

date -s "21 June 2009 11:01:22"

延時

sleep number_of_seconds

兩天後及兩天前

date -d '2 days' +%Y%m%d
date -d '2 days ago' +%Y%m%d

某一天的幾天前

TODAY=`date +%Y%m%d`
DAY_1_AGO=`date -d "$TODAY 1 days ago" +%Y%m%d`

時間戳日期轉換

date -d @1193144433
date -d @1193144433 "+%Y-%m-%d %T"

反向:
date -d "2007-10-23 15:00:23" "+%s"

賦值給變量

DATE=$(date +%Y%m%d)
DATE=`date +%Y%m%d`

調試腳本

打印出所執行的每一行命令

bash -x script.sh
sh -x script.sh

在腳本中設置開關

set -x 在執行時顯示參數和命令
set +x 關閉調試
set -v 當命令進行讀取時顯示輸入
set +v 禁止打印輸入

直接修改腳本

#!/bin/bash -xv

函數和參數

定義函數

function fname()
{
    statements;
}
or
fname()
{
    statements;
}

調用

fname;
傳參
fname arg1 arg2;

接收參數

$1第一個參數
$2第二個參數
$nn個參數

"$@"被擴展成 "$1" "$2" "$3"
"$*"擴展成"$1c$2c$3", 其中cIFS第一個字符

"$@"使用最多, $*將全部的參數當作單個字符串

bash支持遞歸

導出函數,能夠做用到子進程中

export -f fname

函數及命令返回值

cmd;
echo $?

退出狀態,成功退出,狀態爲0,不然,非0

cmd
if [ $? -eq 0 ]
then
    echo "success"
else
    echo "fail"
fi

管道

前一個命令的輸出做爲後一個命令的輸入

$cmd1 | cmd2 | cmd3

讀取命令輸出

子shell  subshell
cmd_output=$(COMMANDS)
or
反引用
cmd_output=`COMMANDS`

子shell自己是獨立進程, 不會對當前shell有任何影響

pwd;
(cd /bin; ls)
pwd #同上一個pwd

保留空格和換行符

out=$(cat text.txt)
echo $out  #丟失全部換行符

out="$(cat text.txt)"
echo $out  #保留

cat a
1
2
3
echo $(cat a)
1 2 3
echo "$(cat a)"
1
2
3

read

read, 用於從鍵盤或標準輸入中讀取文本

讀取n個字符存入變量

read -n number_of_chars variable_name

不回顯的方式讀取密碼

read -s var

顯示提示信息

read -p "Enter input:" var

限時輸入

read -t  timeout var

設置界定符

read -d delim_char var
read -d ":" var
hello:

字段分隔符和迭代器

內部字段分隔符,Internal Field Separator, IFS

IFS默認爲空白字符(換行符,製表符,空格)

data="name,sex,rollno"
oldIFS=$IFS
IFS=,
for item in $data
do
        echo $item
done

IFS=$oldIFS

循環

for循環

echo {1..50}

for i in {a..z}; do actions; done;

or

for((i=0;i<10;i++))
{
    commands;
}

while循環

while condition
do
    commands;
done

until循環

until condition
do
    commands;
done

比較和測試

if條件

if condition;
then
    commands;
elif condition;
then
    commands;
else
    commands;
fi

邏輯運算符進行簡化, 短路運算更簡潔

[ condition ] && action;
[ condition ] || action;

算術比較

-gt 大於
-lt 小於
-ge 大於等於
-le 小於等於
-ne 不等於
-eq 等於

注意[]和操做數之間的空格
[ $var -eq 0 ]

and
[ $var -ne 0 -a $var2 -ge 2 ]
or
[ $var -ne 0 -o $var2 -ge 2 ]

文件測試

[ -f $file_var ] 正常文件路徑或文件名
[ -x $var ] 可執行
-d 目錄
-e 存在
-c 字符設備文件
-b 塊設備文件
-w 可寫
-r 可讀
-L 符號連接

字符串比較

[[ $str1 = $str2 ]]
[[ $str1 == $str2 ]]

[[ $str1 != $str2 ]] 不等

[[ $str1 > $str2 ]]
[[ $str1 < $str2 ]]

[[ -z $str1 ]]  
[[ -n $str1 ]]  非空

if [[ -n $str1 ]] && [[ -z $str2 ]]
then
    commands;
fi

find

搜索指定目錄下的文件,從開始於父目錄,而後搜索子目錄

基本

find base_path

# 打印文件和目錄列表
find . -print  #默認\n分割文件名

文件名

find path -name "*.txt" -print
          -iname  忽略大小寫

多個條件 or
find . \( -name "*.txt" -o -name "*.py" \)

文件路徑

通配符
find /home/users -path "*slynux*" -print

正則
find . -regex ".*\(\.py\|\.sh\)$"
       -iregex 忽略大小寫

否認參數

find . ! -name "*.txt" -print

根據文件類型

find . -type d -print
f 普通文件
l 符號連接
d 目錄
c 字符設備
b 塊設備
s 套接字
p Fifo

設定目錄深度

find . -maxdepth 1 -type f -print
find . -mindepth 2 -type f -print

根據文件時間搜索

計量單位 天
-atime 最近一次訪問時間
-mtime 最後一次被修改時間
-ctime 文件元數據,最近一次修改時間

find . -type f -atime -7 -print #最近七天內被訪問的
find . -type f -atime 7 -print  #剛好在七天前
                      +7 -print #超過七天

計量單位 分鐘
-amin 訪問時間
-mmin 修改時間
-cmin 變化時間

find . -type f -amin +7 -print #訪問時間超過7分鐘的

find . -type f -newer file.txt -print  #用於比較時間戳的參考文件,比參考文件更新的文件

基於文件大小的搜索

find . -type f -size +2k
+ 大於  -小於   無符號,剛好等於

b 塊
c 字節
w 字(2字節)
k 千字節
M 兆字節
G 吉字節

刪除匹配的文件

find . -type f -name "*.swp" -delete
#注意:-delete位置必定是最後

文件權限及全部權

find . -type f -perm 644 -print

find . -type f -user slynux -print

執行命令或動做(最強大的命令)

find . -type f -user root -exec chown slynux {} \;
find . -type f -exec cp {} OLD \;
find . -iname "abc.txt" -exec md5sum {} \;

{} 江北替換成對應文件名
exec沒法結合多個命令,能夠將多個命令放入腳本,調用之

跳過指定目錄

find . \( -name ".git" -prune \) -name '*.txt'

xargs

將標準輸入數據轉化成命令行參數

將stdin接收到的數據從新格式化,再將其做爲參數傳給其餘命令

多行輸入轉化成單行輸出

cat  example.txt | xargs  #空格替換掉\n

切成多行,每行n個參數

cat examplet.txt | xargs -n 3

能夠指定分隔符

echo "aaaXbbbXccc" | xargs -d 'X'

將參數傳遞給腳本(相似循環)

cat args.txt | xargs -n 1 ./cecho.sh

./cecho.sh -p arg1 1
須要變動
cat args.txt | xargs -I {} ./cecho.sh -p {} 1

find與xargs組合

find . -type f -name "*.txt" -print | xargs rm -rf

其餘

cat file | ( while read arg; do cat $arg; done )
cat file | xargs -I {} cat {}

tr

tr能夠對來自標準輸入的字符進行替換,刪除以及壓縮(translate, 能夠將一組字符變成另外一組字符)

tr只能經過stdin,沒法經過其餘命令行進行接收參數

格式

tr [options] source-char-set replace-char-set

選項

-c 取source-char-set補集,一般與-d/-s配合
-d 刪除字source-char-set中的所列的字符
-s 濃縮重複字符,連續多個變成一個

字符替換

cat /proc/12501/environ | tr '\0' '\n'

大小寫替換

echo  "HELLO" | tr 'A-Z' 'a-z'
cat text | tr '\t' ' '

刪除字符

echo "hello 123 world 456"| tr -d '0-9'
hello  world

字符集補集

echo "hello 1 char 2" | tr -d -c '0-9'  #刪除非0-9
12

壓縮字符

連續的重複字符

echo "GNU is    not UNix" | tr -s ' '

字符類

alnum 字母和數字
alpha 字母
cntrl 控制字符
digit 數字
graph 圖形字符
lower 小寫字母
print 可打印字符
punct 標點符號
space 空白字符
upper 大寫字母
xdigit 十六進制字符

tr '[:lower:]' '[:upper:]'

md5sum

32個字符的十六進制串

md5sum filename
md5sum filename1 filename2

sha1sum

40個字符十六進制串

sha1sum file

對目錄進行校驗

需安裝md5deep軟件包

md5deep/sha1deep
md5deep -rl dirname
         r遞歸,l相對路徑

sort

語法

sort [options] [file(s)]

-c 檢查是否已排序
-u 丟棄全部具備相同鍵值的記錄

-b 忽略開頭空白
-d 字典序
-g 通常數值,以浮點數類型比較字段,僅支持gnu
-i 忽略沒法打印的字符

-k 定義排序鍵值字段
-n 以整數類型比較字段
-r 倒轉
-o 輸出到指定文件

排序

sort file1 > file1.sorted
sort -o file1.sored file1

按數字, 要明確

sort -n file1

逆序

sort -r file

測試一個文件是否已經被排過序

sort -C file
if [ $? -eq 0 ]; then
    echo ssss
fi

合併兩個排過序的文件,並不須要對合並後的文件進行再排序

sort -m sorted1 sorted2

根據鍵或者列排序(按照哪個列)

sort -k 1 data

限定特定範圍內一組字符

key=char4-char8
sort -k 2,3 data

sort -k2.4,5.6 file
第二個字段的第四個字符開始比較,直到第五個字段的第六個字符

忽略前導空白及字典序排序

sort -bd unsorted.txt

去重

sort a.txt | uniq
sort -u a.txt

uniq

用法

uniq file

只顯示未重複的記錄

uniq -u file

找出重複的行

uniq -d file
-s 可指定跳過前N個字符
-w 指定用於比較的最大字符數

統計各行出現的次數

uniq -c file

p57

tempfile

只有在基於Debian的發佈版纔有(Ubuntu/Debian)

temp_file=$(tempfile)
等同
temp_file="/tmp/file-$RANDOM"

#$$爲進程id
temp_file="/tmp/var.$$"

split

按大小分割文件, 單位k(KB), M, G, c(byte), w(word)

split -b 10k data.file

-d數字後綴,-a後綴長度

split -b 10k data.file -d -a 4

分割後指定文件名前綴

split -b 10k data.file file_prefix

設置後綴格式
split -b 10k data.file -d -a 4 file_prefix

根據行數分割

spilt -l 10 data

其擴展是csplit,可根據文件特性切分,關注

bash變量匹配切分

sample.jpg

file_jpg="sample.jpg"

從右向左匹配
${file_jpg%.*}
#sample

從左向右匹配
${file_jpg#.*}
#jpg

% # 屬於非貪婪
%% ## 屬於貪婪

貪婪非貪婪

var=hack.fun.book.txt
${var%.*} #hack.fun.book
${var%%.*} #hack

${var#.*} #fun.book.txt
${var##.*} #txt

expect

實現自動化

spawn ./ineractive.sh
expect "Enter the number"
send "1\n"
expect "Enter name:"
send "hello\n"
expect eof

spawn指定須要自動化的命令
expect提供須要等待的消息
send發送消息
expect eof指明命令交互結束

dd

生成任意大小的文件

# 建立一個1M大小的文件junk.data
bs=2M count=2 則文件大小4M

dd if=/dev/zero of=junk.data bs=1M count=1
   輸入文件     輸出文件     塊大小   複製塊數

塊大小單位
字節(1B) c
字(2B)   w
塊(512B)   b
千字節(1024B) k
兆字節(1024KB) M
吉字節(1024MB) G

comm

兩個文件之間比較,輸出三列

onleA \t onlyB \t bothAB

comm A B -1 -2 #刪除第一第二列
-3 刪除第三列

能夠獲得A^B  A-B B-A

mkdir

「mkdir」(Make directory)命令在命名路徑下建立新的目錄。然而若是目錄已經存在了,那麼它就會返回一個錯誤信息」不能建立文件夾,文件夾已經存在了」(「cannot create folder, folder already exists」)

mkdir dirpath

mkdir -p dirpath1/dirpath2

#一次多個目錄
mkdir -p /home/user/{test,test1,test2}

注意:目錄只能在用戶擁有寫權限的目錄下才能建立

ls

ls命令是列出目錄內容(List Directory Contents)的意思。運行它就是列出文件夾裏的內容,多是文件也多是文件夾

ls文件的內容關係

- 普通文件
d 目錄
c 字符設備
b 塊設備
l 符號連接
s 套接字
p 管道

文件權限序列
rwx
rwS  setuid(S),特殊權限, 出如今x的位置, 容許用戶以其擁有者的權限來執行文件, 即便這個可執行文件是由其餘用戶運行的

目錄
r,容許讀取目錄中文件和子目錄列表
w,容許在目錄中建立或刪除文件或目錄
x,指明是否能夠訪問目錄中的文件和子目錄
rwt/rwT 粘滯位,只有建立該目錄的用戶才能刪除目錄中的文件,即便用戶組和其餘用戶也有寫權限,典型例子/tmp, 寫保護

查看目錄

ls -d */
ls -F | grep "/$"
ls -l | grep "^d"
find . -type d -maxdepth 1 -print

其餘

ls -l    命令已詳情模式(long listing fashion)列出文件夾的內容
ls -a    命令會列出文件夾裏的全部內容,包括以」.」開頭的隱藏文件

chmod

設置文件權限

「chmod」命令就是改變文件的模式位。chmod會根據要求的模式來改變每一個所給的文件,文件夾,腳本等等的文件模式(權限)。

設置權限

user group others all
u    g     o      a

chmod u=rwx g=rw o=r filename

chmod u+x filename
chomd a+x filename #全部

chmod a-x filename

chmod 764 filename

#設置粘滯位
chmod a+t dirname

#遞歸改變

chmod 777 . -R

注意:對於系統管理員和用戶來講,這個命令是最有用的命令之一了。在多用戶環境或者服務器上,對於某個用戶,若是設置了文件不可訪問,那麼這個命令就能夠解決,若是設置了錯誤的權限,那麼也就提供了爲受權的訪問。

chown

每一個文件都屬於一個用戶組和一個用戶「chown」命令用來改變文件的全部權,因此僅僅用來管理和提供文件的用戶和用戶組受權。

改變全部權

chown user.group filename

遞歸

chown -R user.group .

每次都以其餘用戶身份執行(容許其餘用戶以文件全部者的身份來執行)

chomod +s executable_file

chown root.root executable_file
chmod +s executable_file
./executable_file

chattr

建立不可修改文件

chattr +i file

一旦被設置爲不可修改, 任何用戶包括超級用戶都不能刪除該文件, 除非其不可修改的屬性被移除

chattr -i file

touch

「touch」命令表明了將文件的訪問和修改時間更新爲當前時間。

touch命令只會在文件不存在的時候纔會建立它(空白文件)。若是文件已經存在了,它會更新時間戳,可是並不會改變文件的內容。

空白文件

touch filename

for name {1..100}.txt
do
    touch $name
done

修改文件訪問時間

touch -a "Fri Jun 25 20:50:14 IST 1999" filename
touch -m #修改文件內容的修改時間

修改文件或目錄的時間戳(YYMMDDhhmm)

touch -t 0712250000 file

注意:touch 能夠用來在用戶擁有寫權限的目錄下建立不存在的文件。

ln

創建軟鏈接

ln -s target symbolic_link_name

若是目的路徑已經存在,而沒有指定 -f 標誌,ln 命令不會建立新的連接,而是向標準錯誤寫一條診斷消息並繼續連接剩下的 SourceFiles。

-f 促使 ln 命令替換掉任何已經存在的目的路徑

讀取連接對應真是路徑

readlink web

 readlink ~/.vim
 /Users/ken/github/k-vim

file

經過查看文件內容來找出特定類型的文件

打印文件類型信息

file filename

打印不包含文件名在內

file -b filename

e.g.

file /etc/passwd
/etc/passwd: ASCII English text

file -b /etc/passwd
ASCII English text

讀文件

while read line;
do
    something
done < filename

diff

生成文件差別

非一體化

diff version1.txt version2.txt

一體化, 可讀性更好

diff -u version.txt

使用patch將命令應用於任意一個文件

diff -u version1.txt version2.txt > version.patch
patch -p1 version1.txt < version.patch

遞歸做用於目錄

diff -Naur directory1 directory2

-N 全部缺失的文件做爲空文件
-a 全部文件視爲文本文件
-u 一體化輸出
-r 遞歸遍歷

前10行打印

head file

前n行

head -n 4 file

扣除最後N行以外的全部行

head -n -5 file

tail

最後10行

tail file

打印最後五行

tail -n 5 file
tail -5 file

扣除前n行

tail -n +(N+1)

實時動態打印

tail -f growing_file

當某個給定進程結束後, tail隨之終結

tail -f file --PID $PID

pushd/popd

將當前路徑壓入棧

pushd

壓入某個路徑

pushd /home/ken

查看當前路徑列表

dirs

切換到某一個

#dirs從左到右編號 0 -
pushd +3

移除最近壓入棧的路徑並切換到下一個目錄

popd

cd

常用的「cd」命令表明了改變目錄。它在終端中改變工做目錄來執行,複製,移動,讀,寫等等操做

切換到上一目錄

cd -

會到HOME目錄

cd
cd ~

會到上一級目錄

cd ..

wc

Word Count

統計行數

wc -l file

統計單詞數

wc -w file

統計字符數

wc -c file

統計全部

wc file

統計最長行的長度

wc file -L

tree

以圖形化的樹狀結構打印文件和目錄的結構,須要自行安裝

tree ~/unixfile

重點標記出匹配某種樣式的文件

tree PATH -P "*.sh"

只標記符合樣式以外的文件

tree path -I PATTERN

同時打印文件和目錄大小

tree -h

grep

文本搜索工具, 支持正則表達式和通配符

‘grep‘命令搜索指定文件中包含給定字符串或者單詞的行

基本用法

grep "match_pattern" file1 file2

使用顏色重點標記

grep word filename --color=auto

擴展型使用正則

grep -E "[a-z]+"
egrep "[a-z]+"

只輸出匹配到的文本部分

grep -o word filename

除匹配行外的全部行

grep -v word filename

統計匹配行數

grep -c 'text' filename

打印出包含匹配字符串的行數

grep linux -n filename

打印樣式匹配所位於的字符或字節的偏移

echo "gnu is not unix" | grep -b -o "not"

搜索多個文件,找出匹配文本位於哪一個文件中

grep -l linux file1 file2
取反
grep -L

遞歸搜索目錄

grep -R "text" dir

忽略大小寫

grep -i "hello" filename

匹配多個樣式

grep -e "pattern1" -e "pattern2" file

運行匹配腳本

grep -f pattern_file source_file

pattern_file:
hello
cool

在搜索中包含、排除文件

grep --include *.{c,cpp} word file

排除

grep --exclude "Readme" filename
--exclude-dir

靜默輸出,用於判斷(不會產生任何輸出)

grep -q word file
if [ $? -eq 0 ]

打印匹配行以前,以後的行

grep -A 3 以後3行
grep -B 3 以前
grep -C 3 先後

使用行緩衝

在使用tail -f命令時是能夠及時看到文件的變化的,可是若是再加上一個grep命令,可能看到的就不那麼及時了,
由於grep命令在buffer寫不滿時就不輸出,能夠經過選項  --line-buffered 來搞定,如:

tail -f file.txt | grep something  --line-buffered

cut

語法

cut -c list [ file ... ]
cut -f list [ -d delim ] [ file ...]

-c list 以字符爲主,做剪切操做
-f list 以字段爲主,做剪切操做

提取字段或列

#第一列
cut -f1 filenam

#第二三列
cut -f2,3 filename

提取補集

cut -f1 --complement filename

指定字段分隔符

cut -d ";" -f2 filename
cut -d : -f 1,5 /etc/passwd

指定字符

-b 字節
-c 字符
-f 字段

cut -c1-5 filename
N-
N-M
-M

ls -l | cut -c 1-10

指定輸出分隔符

cut -c1-3,6-9 --output-delimiter ","

join

語法

join [options] file1 file2

選項
-1 field1
-2 field2
-o file.field
-t separator

例子

join file1 file2

sed

sed(Stream editor)流編輯器, 能夠配合正則使用, 進行替換等

sed替換語法

sed 's/pattern/replace_string/' file

將結果直接運用於源文件

-i 用於, 直接修改源文件

替換第一個
sed -i 's/pattern/replace_string/' file

替換第二個
sed -i 's/pattern/replace_string/2' file

替換全部
sed -i 's/pattern/replace_string/g' file

從第N處開始替換
sed -i 's/pattern/replcae_string/2g' file

移除空白行

sed '/^$/d' file

已匹配字符串標記

引用匹配到的
sed 's/\w\+/[&]/g' filename

組合多個表達式

sed 'exp1' | sed 'exp2'
等價
sed 'exp1;exp2'

使用引用

sed "s/$text/HELLO/"

子串匹配標記(後向引用,最多9個)

sed 's/\([a-z]\+\)' \([A-Z\]\+\)/\2 \1/' filename

保存到文件

sed 's/pattern/replacement/' -i outfile

使用其餘分隔符

sed 's#/home/#/tmp/#'

awk

基本結構

awk -F '-' 'BEGIN{statements} {statements} END{statements}' file
表達式中單引號能夠換成雙引號
BEGIN -> 每一行,執行statements, 執行END

打印某一列

awk -F '-' '{print $0}' file #所有
awk -F '-' '{print $2}' file #第二列

print拼接字符

awk '{var="v1"; var1="v2"; print var1"-"var2;}'

特殊變量

NR nuber of records, 記錄數
NF number of fields, 字段數
$0 當前行文本
$1 第一字段
$2 第二字段
$NF 最後一個字段

FILENAME 當前輸入文件的名稱
FNR 當前輸入文件記錄數
FS 字段分隔字符
OFS 輸出字段分隔符,默認" "
ORS 輸出記錄分隔符,默認"\n"

統計行數

awk 'END{print NF}'

將外部變量值傳遞給awk

awk -v VARIABLE=$VAR '{ print VARIABLE }'
awk '{print v1, v2}' v1=$var1 v2=$var2

讀取行

seq 5 | awk '{ getline var; print var}'

進行行過濾

awk 'NR<5' #行號小於5
awk 'NR==1,NR==4' #行號在1到5之間
awk '/linux/' #包含樣式linux
awk '!/linux/' #不包含
awk '$1 ~/jones/' #第一個字段包含jones

tail file
awk 'NR <= 10' file

設定分隔符

awk -F: '{ print $NF }' file

設定輸出分隔符

awk -F: -v "OFS=-" '{print $1,$2}' /etc/passwd

打印空行

awk 'NF>0 {print $0}'
or
awk 'NF>0' #未指定action默認打印

print和printf

awk -F: '{print "User", $1, "is really", $5}' /etc/passwd
awk -F: '{printf "User %s is really %s\n", $1, $5}' /etc/passwd

awk中使用循環

for(i=0;i<10;i++) { print $i; }

for(i in array) { print array[i] }

內建函數

length(str)
index(str,search_str)
split(str,array,delimiter) 用界定符生成一個字符串列表
substr(string, start, end) #子串
sub(regex, replacement_str, str) #正則替換首個匹配位置
gsub(regex, replacement_str, string) #最後一個匹配位置
match(string, regex) #檢查是否可以匹配字符串
tolower(string) #轉小寫
toupper(string) #轉大寫

寫成腳本文件

BEGIN {}
pattern1 {action1}
pattern2 {action2}
END {}

文件迭代

讀文件行

while read line;
do
    echo $line;
done < file.txt

迭代每一個單詞

for word in $line;
do
    echo $word;
done

迭代每個字符

for((i=0;i<${#word};i++))
do
    echo ${word:i:1} ;
done

paste

按列合併文件

paste file1 file2 file3

指定分隔符

paste file1 file2 -d ','

tac

逆序打印

tac file1 file2

rev

接收一個文件或stdin做爲輸入, 逆序打印每一行內容

echo "abc" | rev

wget

Wget是用於非交互式(例如後臺)下載文件的免費工具.支持HTTP, HTTPS, FTP協議和 HTTP 代理(選項多, 用法靈活)

一個用於文件下載的命令行工具

wget URL1 URL2

指定保存文件名

wget URL -O local.txt

指定日誌,默認達到stdout

wget URL -O local.txt -o log.txt

指定重複嘗試次數

wget -t 5 URL

下載限速

wget --limit-rate 20k url

指定限額

wget -Q 100m url

斷點續傳

wget -c URL

$ wget -c -t 100 -T 120 http://www.linux.com/xxxx.data

當文件特別大或者網絡特別慢的時候,每每一個文件尚未下載完,鏈接就已經被切斷,此時就須要斷點續傳。
wget的斷點續傳是自動的。
-c 選項的做用爲斷點續傳。
-t 參數表示重試次數(例如重試100次,-t 100,若是設成-t 0,表示無窮次重試,直到鏈接成功)
-T 參數表示超時等待時間,例如-T 120,表示等待120秒鏈接不上就算超時

複製或鏡像整個網站

wget --mirror exampledomain.com
wget -r -N -l DEPTH URL
     遞歸,容許對文件使用時間戳,層級
$ wget -r -np -nd http://www.linux.com/packs/

-np 的做用是不遍歷父目錄
-nd 表示不在本機從新建立目錄結構

訪問須要認證的HTTP/FTP

wget --user username --password pass URL

post請求

wget url -post-data "name=value" -O output.html

批量下載

wget -i downloads.txt #將文件地址寫入一個文件

用wget命令執行ftp下載

wget -m ftp://username:password@hostname

curl

基本用法

curl url > index.html

不顯示進度信息

curl URL --slient

將內容寫入文件,而非標準輸出

curl URL --slient -O

寫入指定文件

curl URL --slient -o filename

顯示進度條

curl url -o index.html --progress

斷點續傳

curl -C - URL

設置參照頁字符串

curl --referer Referer_URL target_URL
跳轉到target_URL,其頭部referer爲Referer_URL

設置cookie

curl url --cookie "user=slynux;pass=hack"
另存爲一個文件

curl URL --cookie-jar cookie_file

設置用戶代理

curl URL --user-agent "Mozilla/5.0"
頭部信息
curl -H "Host: www.slynux.org" -H "Accept-language: en" url

限定下載帶寬

curl url --limit-rate 20k

指定最大下載量(可下載的最大文件大小)

curl url --max-filesize bytes
超出限制的話,返回非0

進行認證

curl -u user:pass url

只打印頭部信息,不下載遠程文件

curl -I url
curl -head url

發送post請求

curl URL -d "va1=1&va2=2"
         --data

lynx

將網頁以ascii字符形式下載

lynx -dump URL > webpage_as_text.txt

打印出網站的文本板塊而非html

lynx -dump url

生成信息文件

lynx -traversal url

tar

「tar」命令是磁帶歸檔(Tape Archive),對建立一些文件的的歸檔和它們的解壓頗有用。

將多個文件和文件夾保存成單個文件, 同時還能保留全部的文件屬性

對文件進行歸檔

-c create file,建立文件
-f specify filename,指定文件名

tar -cf output.tar file1 file2 file3
tar -cf output.tar *.txt

tar -cvf output.tar *.txt

向歸檔中追加文件

tar -rvf original.tar new_file
-r,追加

查看過程當中更多信息

tar -tvvf archive.tar
-v/-vv, verbose

提取文件或文件夾

-x, exact
tar -xf archive.tar

-C,指定文件
tar -xf archive.tar -C /path/to/extraction_directory


tar -xvf archive.tar

提取指定文件

tar -xvf file.tar file1 file4

拼接兩個歸檔文件

tar -Af file1.tar file2.tar
#file2合併到file1中

只有在文件內容修改時間更新(newer),才進行添加

tar -uvvf archive.tar filea

比較歸檔文件與文件系統中的內容

tar -df archive.tar filename1 filename2

從歸檔文件中刪除文件

tar -f archive.tar --delete file1 file2

提取到某個目錄

 tar zxvf package.tar.gz -C new_dir

壓縮歸檔文件

gzip/gunzip -> .gz
f.tar.gz   -z
tar -czvf 
tar -xzvf

bzip/bunzip -> .bz2
f.tar.bz2  -j

f.tar.lzma --lzma
f.tar.lzo

從歸檔中排除部分文件

tar -cf arch.tar * --exclude "*.txt"
cat list
   filea
   fileb
tar -cf arch.tar * -X list

排除版本控制文件

tar --exclude-vcs -czvvf source.tar.gz files

打印總字節數

tar -cf arc.tar * --exclude "*.txt" --totals

cpio

使用頻率不高

歸檔,保留文件屬性(權限、全部權等)

echo file1 file2 | cpio -ov > archive.cpio
-o 指定輸出
-v 打印歸檔文件列表

列出cpio中的文件內容

cpio -it < archive.cpio
-i指定輸入
-t列出歸檔文件中的內容

gzip

壓縮,會刪除源文件

gzip filename
#got filename.gz

解壓

gunzip filename.gz

列出文件屬性信息

gzip -l text.gz

stdin讀入文件並寫出到stdout

cat file | gzip -c > file.gz

壓縮歸檔文件

tar -czvvf archive.tar.gz [files]
or
tar -cvvf archive.tar.gz [files]
gzip archive.tar

指定壓縮率

1-9,1最低,但速度最快
gzip -9 test.img

zcat

無需解壓縮,直接從.gz中提取內容

zcat test.gz

bzip

更大的壓縮率

bzip2 filename

解壓縮

bunzip2 filename.bz2

stdin到stdout

cat file > bzip2 -c > file.tar.bz2

壓縮歸檔

tar -cjvvf archive.tar.bz2 [files]
or
tar -cvvf archive.tar [files]
bzip2 archive.tar

保留輸入文件

bunzip2 test.bz2 -k

壓縮率

bzip2 -9 test.img

lzma

比gzip/bzip2更好的壓縮率

壓縮

lzma filename

解壓

unlzma filename.lzma

stdin到stdout

cat file | lzma -c > file.lzma

建立歸檔

tar -cavvf archive.tar.lzma [files]
    -xavf

保留輸入文件

lzma test.bz2 -k

壓縮率

lzma -9 test.img

zip

壓縮

zip archive_name.zip [source files/dirs]

對目錄和文件進行遞歸操做

zip -r archive.zip folder1 file2

base64

編碼

base64 filename > outfile
cat file | base64 > outfile

解碼

base64 -d file > outfile

md5sum

「md5sum」就是計算和檢驗MD5信息簽名。md5 checksum(一般叫作哈希)使用匹配或者驗證文件的文件的完整性,由於文件可能由於傳輸錯誤,磁盤錯誤或者無惡意的干擾等緣由而發生改變。

單向散列

md5sum file
sha1sum file

rsync

能夠對位於不一樣位置的文件和目錄進行備份, 藉助差別計算和壓縮技術實現最小化數據傳輸量

要確保遠端安裝了 openssh

從一個目錄複製到另外一個目錄

rsync -av source_path dest_path
-a 進行歸檔  -v打印細節
路徑可使本地,也能夠是遠端路徑

e.g.
rsync -av /home/test /home/backups/ #複製到backups目錄下
rsync -av /home/test /home/backups  #建立backups目錄, 複製

備份到遠程服務器

rsync -av source_path user@host:PATH
能夠反向

改善傳輸速度

rsync -avz source destination

排除文件

rsync -avz source dest --exclude "*.txt"
                       --exclude-from FILEPATH
FILEPATH:
*.bak

更新備份時,刪除不存在的文件

rsync -avz source dest --delete

git

初始化目錄

git init

配置用戶信息

git config --global user.name "wklken"
git config --global user.email "wklken@yeah.net"

加到遠端

git remote add origin user@remotehost:/home/backup/backup.git
git push origin master

添加

git add *

刪除

git rm *.py

標記一個檢查點

git commit -m "Commit message"

查看日誌

git log

回滾到某個版本

git checkout hashid [ filename ]

克隆

git clone url

dd

Dtat Definiton, 要注意參數順序, 錯誤的參數會損毀全部數據

能夠用來轉換和複製文件,大多數時間是用來複制iso文件(或任何其它文件)到一個usb設備(或任何其它地方)中去,因此能夠用來製做USB啓動器

語法說明

dd if=SOURCE of=TARGET bs=BLOCK_SIZE count=COUNT
if/of  輸入/輸出文件或設備路徑
bs塊大小
count 限制複製到目標的字節數

dd if=/dev/zero of=/dev/sda1

#製做iso 從cdrom設備讀取全部數據, 建立iso文件
dd if=/dev/cdrom of=cdrom.iso

備份恢復

dd if=/dev/sda1 of=x.img

dd if=x.img of=/dev/sda1

mount

mount 是一個很重要的命令,用來掛載不能自動掛載的文件系統。你須要root權限掛載設備。在插入你的文件系統後,

mount --bind /source /destination

首先運行」lsblk」命令,識別出你的設備,而後把分配的設備名記下來。
root@tecmint:~# lsblk
建立一個任何名字的目錄,可是最好和引用相關。

root@tecmint:~# su
Password:
root@tecmint:~# cd /dev
root@tecmint:~# mkdir usb
如今將「sdb1」文件系統掛載到「usb」目錄.
root@tecmint:~# mount /dev/sdb1 /dev/usb

掛載鏡像

mount -o loop file.img /mnt/mount_point

網絡相關

ifconfig

顯示網絡接口、子網掩碼等詳細信息

ifconfig
/sbin/ifconfig

打印某個特定網絡接口

ifconfig iface_name

e.g.
ifconfig en1

HWaddr     MAC地址
inet addr  ip地址
Bcast      廣播地址
Mask       子網掩碼

設置網絡接口ip

ifconfig wlan0 192.168.0.80

dns

cat /etc/resolv.conf

host google.com #Dns查找

nslookup google.com #更詳細信息

修改dns/host

echo nameserver IP_ADDRESS >> /etc/resolv.conf

echo ip domain >> /etc/hosts

ping

ping www.baidu.com

路由信息

顯示路由表
route

以數字形式顯示地址
route -n

設置默認網關

route add default gw 192.168.0.1 wlan0

trace_route, 顯示分組途徑的全部網關的地址

traceroute google.com

ping

基本

ping ADDRESS  #主機名,域名或ip

PING命令能夠獲得RTT(Round Trip Time), 分組從源到目的主機的往返時間, 單位ms

限制發送分組數

ping ADDRESS -c COUNT

ping

fping

同時ping一組ip, 並且響應很是快

fping -a ip1 ip2 -g
fping -a 192.160.1/24 -g
fping -a < ip.list

-a, 全部活動主機的ip
-g, 從IP/mask生成的ip地址範圍

進行dns查詢

fping -a -d 2 > /dev/null  < ip.list

lftp

基本用法

lftp username@ftphost
cd dir
lcd改變本地主機目錄
mkdir 建立目錄
get/put 下載上傳
quit退出

scp

scp是 secure copy的縮寫, scp是linux系統下基於ssh登錄進行安全的遠程文件拷貝命令。

linux的scp命令能夠在linux服務器之間複製文件和目錄.

拷貝文件

scp filename user@remotehost:/home/pat
ip或主機名都可

scp SOURCE DESTINATION

遞歸複製

scp -r dir1 user@remotehost:/home/backup

提升拷貝速度

scp  -c arcfour -r -P20755 dir/ 192.168.2.*:/**/**/data/
-c arcfour 這個算法沒有加校驗不保證完整性,注意慎用,內網1000M帶寬,默認算法速度只能達到30M/s,用arcfour這個算法速度能夠達到50-80M/s

SSH

鏈接遠程

ssh username@remote_host

ssh -p port username@remote_host

執行命令

ssh username@remote_host 'cmd1; cmd2' > stdout.txt 2>errors.txt

壓縮功能

ssh -C user@hostname 'cmds'

打通ssh

1.建立SSH密鑰
  ssh-keygen -t rsa
  公鑰, ~/.ssh/id_rsa.pub
2.登錄遠端服務器, 將公鑰寫入 ~/.ssh/authorized_keys

lsof

列出系統中開放端口及運行在端口上的服務

lsof -i

配合grep, 獲取須要的信息

netstat

查看開放端口和服務

netstat -tnp

磁盤和系統

du

du = disk usage

估計文件的空間佔用。 逐層統計文件(例如以遞歸方式)並輸出摘要。

查看佔用磁盤空間

du FILENAME1 FILENAME2

查看目錄

du -a dir

以KB,MB或塊爲單位展現

du -h FILENAME1

顯示總計狀況

du -c FILENAME1

只顯示合計

du -s FILENAME1

以特定單位打印

du -b/-k/-m/-B FILES

排除部分文件

du --exclude "*.txt" DIR
   --exclude-from EXCLUDE.txt DIR

指定最深層級

du --max-depth 2 DIR

指定目錄最大的10個文件

du -ak S_DIR | sort -nrk 1 | head

df

df = disk free

報告系統的磁盤使用狀況。在跟蹤磁盤使用狀況方面對於普通用戶和系統管理員都頗有用。 ‘df‘ 經過檢查目錄大小工做,但這一數值僅當文件關閉時才獲得更新。

查看磁盤可用空間

df
df -h

time

計算命令執行時間

time COMMAND

real 掛鐘時間, 從開始執行到結束的時間
user 進程花費在用戶模式中的cpu時間, 真正用於執行進程所花得時間
sys  進程花費在內核模式中的cpu時間

寫入文件

time -o output.txt COMMAND
time -a output.txt COMMAND #追加

格式化輸出

time -f "Time: %U"  -a -o timing.log uname
real %e
user %U
sys %S

who

獲取當前用戶登錄信息

who / w

當前登錄主機的用戶列表

users

uptime

查看系統已經通電運行多長時間了

uptime
#也能夠看到負載

last

顯示上次用戶登陸信息- 前一次啓動會話信息

last

獲取單個用戶

last USER

watch

在終端中以固定間隔監視命令輸出

#default 2s
watch ls

# 5s
watch -n 5 ls

顏色標示

watch -d 'COMMAND'

進程和線程

ps

ps命令給出正在運行的某個進程的狀態,每一個進程有特定的id成爲PID。

ps命令主要查看系統中進程的狀態

USER              PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
USER表示啓動進程用戶
PID表示進程標誌號

%CPU表示運行該進程佔用CPU的時間與該進程總的運行時間的比例
%MEM表示該進程佔用內存和總內存的比例。

VSZ表示佔用的虛擬內存大小,以KB爲單位。
RSS爲進程佔用的物理內存值,以KB爲單位。

TTY表示該進程創建時所對應的終端,"?"表示該進程不佔用終端。
STAT表示進程的運行狀態,包括如下幾種代碼:
    D,不可中斷的睡眠;
    R,就緒(在可運行隊列中);
    S,睡眠;
    T,被跟蹤或中止;
    Z,終止(僵死)的進程,Z不存在,但暫時沒法消除;
    W,沒有足夠的內存分頁可分配;<高優先序的進程;
    N,低優先序的進程;
    L,有內存分頁分配並鎖在內存體內(實時系統或I/O)。

START爲進程開始時間。
TIME爲執行的時間。
COMMAND是對應的命令名。

查看進程信息

#當前終端
ps

PID TTY TIME CMD
PID  進程ID
TTY  終端
TIME 進程啓動後過去的時間
CMD  進程對應的命令

顯示更多信息

#當前終端
ps -f

查看全部進程

ps aux
ps -ef

查看某個用戶的全部進程

ps U ken

命令格式

ps [OTHER OPTIONS] -o par1,par2,par3
ps -eo comm,pcpu | head
pmem 內存使用率,comm可執行文件名,user啓動進程的用戶,etime啓動後度過的時間

設置升序降序

ps -eo comm,pcpu --sort -pcpu | head
+升序,-降序

找出給定命令名對應進程ID

ps -C COMMAND_NAME
ps -C bash -o pid=

進程線程相關

ps -eLf --sort -nlwp | head

查看子進程樹

ps axwef

注意:當你要知道有哪些進程在運行或者須要知道想殺死的進程PID時ps命令很管用。你能夠把它與‘grep‘合用來查詢指定的輸出結果,例如:

# ps -A | grep -i ssh

pgrep

pgrep只須要命令名的一部分, ps須要準確的全名

基本用法

pgrep bash

指定進程的用戶

pgrep -u root,slynux COMMAND

返回匹配進程數

pgrep -c COMANND

top

查看佔用cpu最多的進程列表

top

kill

kill是用來殺死已經可有可無或者沒有響應的進程,殺死一個進程須要知道進程的PID

列出可用信號

kill -l

終止一個進程

kill PROCESS_ID_LIST

強殺進程

kill -9 PROCESS_ID

殺死一組命令

killall process_name
killall -9 process_name

指定用戶
killall -u USERNAME process_name

pkill

殺,接受進程名

pkill process_name
pkill -s SIGNAL process_name

which

查找PATH下某個命令位置

which ls

whereis

whereis的做用是用來定位命令的二進制文件\資源\或者幫助頁.舉例來講,得到ls和kill命令的二進制文件/資源以及幫助頁:

whereis ls
whereis kill

相似which,多了命令手冊位置,源代碼位置

注意:當須要知道二進制文件保存位置時有用.

file

肯定文件類型

whatis

對命令的簡短描述

hostname

當前主機名

uname

主機名
uname -n

#內核版本,硬件架構等
uname -a

#內核發行版本
uname -r

主機類型(32位/64位)
uname -m

cpu相關信息
cat /proc/cpuinfo

內存信息
cat /proc/meminfo

例子

#uname -a
Linux tecmint 3.8.0-19-generic #30-Ubuntu SMP Wed May 1 16:36:13 UTC 2013 i686 i686 i686 GNU/Linux

1. 「Linux「: 機器的內核名
2. 「tecmint「: 機器的分支名
3. 「3.8.0-19-generic「: 內核發佈版本
4. 「#30-Ubuntu SMP「: 內核版本
5. 「i686「: 處理器架構
6. 「GNU/Linux「: 操做系統名

crontab

格式

* * * * * cmd
分鐘(0-59),小時(0-23),天(1-31),月份(1-12),工做日(0-6)

A,B  A and B
*/C  every C

查看

crontab -l
crontab -l -u slynux

編輯

crontab -e

移除

crontab -r
crontab -u slynux -r

能夠在crontab 中加入環境變量

getopts

命令行參數處理

while getopts :f:vql opt
do
    case $opt in
    f)  file=$OPTARG
        ;;
    v)  verbose=true
        ;;
    ....

history

「history」命令就是歷史記錄。它顯示了在終端中所執行過的全部命令的歷史

history

注意:按住「CTRL + R」就能夠搜索已經執行過的命令,它能夠你寫命令時自動補全

sudo

「sudo」(super user do)命令容許受權用戶執行超級用戶或者其它用戶的命令。經過在sudoers列表的安全策略來指定。

注意:sudo 容許用戶借用超級用戶的權限,然而」su」命令其實是容許用戶以超級用戶登陸。因此sudo比su更安全。並不建議使用sudo或者su來處理平常用途,由於它可能致使嚴重的錯誤若是你意外的作錯了事,這就是爲何在linux社區流行一句話:

「To err is human, but to really foul up everything, you need root password.」「人非聖賢孰能無過,可是擁有root密碼就真的萬劫不復了。」

cal

「cal」(Calender),它用來顯示當前月份或者將來或者過去任何年份中的月份

cal
cal 02 1835

cp

「copy」就是複製。它會從一個地方複製一個文件到另一個地方

cp file1 file2
cp -r dir1 dir2

快速備份一個文件:

cp some_file_name{,.bkp}

注意: cp,在shell腳本中是最經常使用的一個命令,並且它可使用通配符(在前面一塊中有所描述),來定製所需的文件的複製。

mv

「mv」命令將一個地方的文件移動到另一個地方去。

「mv」命令將一個地方的文件移動到另一個地方去。

pwd

「pwd」(print working directory),在終端中顯示當前工做目錄的全路徑。

注意: 這個命令並不會在腳本中常用,可是對於新手,當從鏈接到nux好久後在終端中迷失了路徑,這絕對是救命稻草。

free

free -m
             total       used       free     shared    buffers     cached
Mem:          7982       6811       1171          0        350       5114
-/+ buffers/cache:       1346       6636
Swap:        16935         11      16924

顯示剩餘內存

free -m | grep cache | awk '/[0-9]/{ print $4" MB" }'

在這裏例子中,應用程序只使用了1346MB內存,還有6636MB空閒內存可使用.

一些簡單的計算方法:

物理已用內存 = 實際已用內存 - 緩衝 - 緩存 = 6811M - 350M - 5114M

物理空閒內存 = 總物理內存 - 實際已用內存 + 緩衝 + 緩存

應用程序可用空閒內存 = 總物理內存 - 實際已用內存

應用程序已用內存 = 實際已用內存 - 緩衝 - 緩存

原始解釋:轉至互聯網:Linux的基本原則是沒有資源應該被浪費.所以核心會使用盡量多的RAM,來緩存來自本地和遠程的文件系統的信息.系統作讀寫操做的時候,會將與當前運行的進程相關的數據儘可能存儲在RAM裏.系統報告的緩存是緩衝和頁緩存二者之和.緩存並非在進程結束的時候被回收(你可能很快會啓動另一個進程,須要一樣的數據),而是隨需回收–好比,當你啓動一個須要大量內存的進程時,Linux核心會從內存中回收緩存,將獲得的內存分配給新的進程.

有些區域,好比匿名內存映射(mmps)和共享內存區域,它們被報告爲緩存,但不是被核心直接釋放.通常的緩存不映射到進程的地址空間,僅僅是簡單的核心映射,而這些特別的緩存映射到全部掛接到它們上面的進程.

eval

eval "ls -l"

basename

獲取路徑中文件部分

basename resolv.conf #resolv.conf
basename /etc/resolv.conf # resolv.conf

cmp

比較兩個任意類型的文件並將結果輸出至標準輸出。若是兩個文件相同, ‘cmp‘默認返回0;若是不一樣,將顯示不一樣的字節數和第一處不一樣的位置。

cmp file1 file2
diff file1 file2

rm

‘rm’ 標準移除命令。 rm 能夠用來刪除文件和目錄

rm file1
rm -r dir1  #遞歸刪除空目錄

強刪

rm -rf fileordir

警告: 」rm -rf」 命令是一個破壞性的命令,假如你不當心刪除一個錯誤的目錄。一旦你使用’rm -rf’ 刪除一個目錄,在目錄中全部的文件包括目錄自己會被永久的刪除,因此使用這個命令要很是當心。

service

‘service‘命令控制服務的啓動、中止和重啓,它讓你可以不重啓整個系統就可讓配置生效以開啓、中止或者重啓某個服務。

注意:要想使用service命令,進程的腳本必須放在‘/etc/init.d‘,而且路徑必須在指定的位置。若是要運行「service apache2 start」實際上實在執行「service /etc/init.d/apache2 start」.

man

‘man‘是系統幫助頁。Man提供命令全部選項及用法的在線文檔。幾乎全部的命令都有它們的幫助頁

man thecommand

注意:系統幫助頁是爲了命令的使用和學習而設計的。

passwd

這是一個很重要的命令,在終端中用來改變本身密碼頗有用。顯然的,由於安全的緣由,你須要知道當前的密碼。

gcc

gcc 是Linux環境下C語言的內建編譯器。下面是一個簡單的C程序,在桌面上保存爲Hello.c (記住必需要有‘.c‘擴展名

gcc Hello.c
./a.out
gcc -o Hello Hello.c
./Hello

注意: 編譯C程序時,輸出會自動保存到一個名爲「a.out」的新文件,所以每次編譯C程序 「a.out」都會被修改。所以編譯期間最好定義輸出文件名.,這樣就不會有覆蓋輸出文件的風險了。

g++

g++是C++的內建編譯器

g++ Add.cpp
./a.out
g++ -o Add Add.cpp
./Add

java

Java 是世界上使用最普遍的編程語言之一. 它也被認爲是高效, 安全和可靠的編程語言. 如今大多數基於網絡的服務都使用Java實現.

javac tecmint.java
java tecmint

注意: 幾乎全部的Linux發行版都帶有gcc編譯器, 大多數發行版都內建了g++ 和 java 編譯器, 有些也可能沒有. 你能夠用apt 或 yum 安裝須要的包.

關於/dev/null

特別有用的特殊文件,位桶,傳送到此文件的數據都會被系統丟棄。

語言及亂碼

查看變量值

echo $LANG   未設置任何LC_XXX時使用的默認值
echo $LC_ALL 覆蓋全部LC_XXX變量,總控開關

好的作法是,避免爲任何LC_XXX變量賦值,使用LC_ALL和LANG來控制

避免亂碼:從編輯器到語言,再到系統,統一編碼爲UTF-8

shell的版本

bash --version
相關文章
相關標籤/搜索