Linux Shell腳本攻略的筆記,markdown編寫,能夠速查(ctrl+f)html
2013-09-08 從歷史網摘中補充 2014-02-16 增長<<shell腳本指南>>筆記補充java
sed簡明教程linux
awk簡明教程git
#!/bin/bash # do something
sh script.sh or chmod a+x script.sh ./script.sh # 會讀取首行的解釋器, 執行
cmdgithub
cmd1; cmd2 or cmd1 cmd2
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"
能夠格式化字符串, 使用參數同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當前工做目錄
獲取某個進程名對應進程id
pgrep gedit
整數運算
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, 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是一個系統自建的shell命令,容許你爲名字比較長的或者常用的命令指定別名。
alias new_command='command seq' unalias new_command 使用原生命令 \new_command
「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第二個參數 $n第n個參數 "$@"被擴展成 "$1" "$2" "$3" "$*"擴展成"$1c$2c$3", 其中c是IFS第一個字符 "$@"使用最多, $*將全部的參數當作單個字符串
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, 用於從鍵盤或標準輸入中讀取文本
讀取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 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'
將標準輸入數據轉化成命令行參數
將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能夠對來自標準輸入的字符進行替換,刪除以及壓縮(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:]'
32個字符的十六進制串
md5sum filename md5sum filename1 filename2
40個字符十六進制串
sha1sum file
需安裝md5deep軟件包
md5deep/sha1deep md5deep -rl dirname r遞歸,l相對路徑
語法
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 file
只顯示未重複的記錄
uniq -u file
找出重複的行
uniq -d file -s 可指定跳過前N個字符 -w 指定用於比較的最大字符數
統計各行出現的次數
uniq -c file
p57
只有在基於Debian的發佈版纔有(Ubuntu/Debian)
temp_file=$(tempfile) 等同 temp_file="/tmp/file-$RANDOM" #$$爲進程id temp_file="/tmp/var.$$"
按大小分割文件, 單位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,可根據文件特性切分,關注
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
實現自動化
spawn ./ineractive.sh expect "Enter the number" send "1\n" expect "Enter name:" send "hello\n" expect eof spawn指定須要自動化的命令 expect提供須要等待的消息 send發送消息 expect eof指明命令交互結束
生成任意大小的文件
# 建立一個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
兩個文件之間比較,輸出三列
onleA \t onlyB \t bothAB comm A B -1 -2 #刪除第一第二列 -3 刪除第三列 能夠獲得A^B A-B B-A
「mkdir」(Make directory)命令在命名路徑下建立新的目錄。然而若是目錄已經存在了,那麼它就會返回一個錯誤信息」不能建立文件夾,文件夾已經存在了」(「cannot create folder, folder already exists」)
mkdir dirpath mkdir -p dirpath1/dirpath2 #一次多個目錄 mkdir -p /home/user/{test,test1,test2}
注意:目錄只能在用戶擁有寫權限的目錄下才能建立
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會根據要求的模式來改變每一個所給的文件,文件夾,腳本等等的文件模式(權限)。
設置權限
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 user.group filename
遞歸
chown -R user.group .
每次都以其餘用戶身份執行(容許其餘用戶以文件全部者的身份來執行)
chomod +s executable_file chown root.root executable_file chmod +s executable_file ./executable_file
建立不可修改文件
chattr +i file
一旦被設置爲不可修改, 任何用戶包括超級用戶都不能刪除該文件, 除非其不可修改的屬性被移除
chattr -i file
「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 -s target symbolic_link_name
若是目的路徑已經存在,而沒有指定 -f 標誌,ln 命令不會建立新的連接,而是向標準錯誤寫一條診斷消息並繼續連接剩下的 SourceFiles。
-f 促使 ln 命令替換掉任何已經存在的目的路徑
讀取連接對應真是路徑
readlink web readlink ~/.vim /Users/ken/github/k-vim
經過查看文件內容來找出特定類型的文件
打印文件類型信息
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 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
最後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
壓入某個路徑
pushd /home/ken
查看當前路徑列表
dirs
切換到某一個
#dirs從左到右編號 0 - pushd +3
移除最近壓入棧的路徑並切換到下一個目錄
popd
常用的「cd」命令表明了改變目錄。它在終端中改變工做目錄來執行,複製,移動,讀,寫等等操做
切換到上一目錄
cd -
會到HOME目錄
cd cd ~
會到上一級目錄
cd ..
Word Count
統計行數
wc -l file
統計單詞數
wc -w file
統計字符數
wc -c file
統計全部
wc file
統計最長行的長度
wc file -L
以圖形化的樹狀結構打印文件和目錄的結構,須要自行安裝
tree ~/unixfile
重點標記出匹配某種樣式的文件
tree PATH -P "*.sh"
只標記符合樣式以外的文件
tree path -I PATTERN
同時打印文件和目錄大小
tree -h
文本搜索工具, 支持正則表達式和通配符
‘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 -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 [options] file1 file2 選項 -1 field1 -2 field2 -o file.field -t separator
例子
join file1 file2
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 -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 file1 file2 file3
指定分隔符
paste file1 file2 -d ','
逆序打印
tac file1 file2
接收一個文件或stdin做爲輸入, 逆序打印每一行內容
echo "abc" | rev
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 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
將網頁以ascii字符形式下載
lynx -dump URL > webpage_as_text.txt
打印出網站的文本板塊而非html
lynx -dump url
生成信息文件
lynx -traversal url
「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
使用頻率不高
歸檔,保留文件屬性(權限、全部權等)
echo file1 file2 | cpio -ov > archive.cpio -o 指定輸出 -v 打印歸檔文件列表
列出cpio中的文件內容
cpio -it < archive.cpio -i指定輸入 -t列出歸檔文件中的內容
壓縮,會刪除源文件
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
無需解壓縮,直接從.gz中提取內容
zcat test.gz
更大的壓縮率
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
比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 archive_name.zip [source files/dirs]
對目錄和文件進行遞歸操做
zip -r archive.zip folder1 file2
編碼
base64 filename > outfile cat file | base64 > outfile
解碼
base64 -d file > outfile
「md5sum」就是計算和檢驗MD5信息簽名。md5 checksum(一般叫作哈希)使用匹配或者驗證文件的文件的完整性,由於文件可能由於傳輸錯誤,磁盤錯誤或者無惡意的干擾等緣由而發生改變。
單向散列
md5sum file sha1sum file
能夠對位於不一樣位置的文件和目錄進行備份, 藉助差別計算和壓縮技術實現最小化數據傳輸量
要確保遠端安裝了 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 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
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 是一個很重要的命令,用來掛載不能自動掛載的文件系統。你須要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 /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 ADDRESS #主機名,域名或ip
PING命令能夠獲得RTT(Round Trip Time), 分組從源到目的主機的往返時間, 單位ms
限制發送分組數
ping ADDRESS -c COUNT ping
同時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 username@ftphost cd dir lcd改變本地主機目錄 mkdir 建立目錄 get/put 下載上傳 quit退出
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 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 -i
配合grep, 獲取須要的信息
查看開放端口和服務
netstat -tnp
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 = disk free
報告系統的磁盤使用狀況。在跟蹤磁盤使用狀況方面對於普通用戶和系統管理員都頗有用。 ‘df‘ 經過檢查目錄大小工做,但這一數值僅當文件關閉時才獲得更新。
查看磁盤可用空間
df df -h
計算命令執行時間
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 / w
當前登錄主機的用戶列表
users
查看系統已經通電運行多長時間了
uptime #也能夠看到負載
顯示上次用戶登陸信息- 前一次啓動會話信息
last
獲取單個用戶
last USER
在終端中以固定間隔監視命令輸出
#default 2s watch ls # 5s watch -n 5 ls
顏色標示
watch -d 'COMMAND'
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只須要命令名的一部分, ps須要準確的全名
基本用法
pgrep bash
指定進程的用戶
pgrep -u root,slynux COMMAND
返回匹配進程數
pgrep -c COMANND
查看佔用cpu最多的進程列表
top
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 process_name pkill -s SIGNAL process_name
查找PATH下某個命令位置
which ls
whereis的做用是用來定位命令的二進制文件\資源\或者幫助頁.舉例來講,得到ls和kill命令的二進制文件/資源以及幫助頁:
whereis ls whereis kill
相似which,多了命令手冊位置,源代碼位置
注意:當須要知道二進制文件保存位置時有用.
肯定文件類型
對命令的簡短描述
當前主機名
主機名 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「: 操做系統名
格式
* * * * * 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 中加入環境變量
命令行參數處理
while getopts :f:vql opt do case $opt in f) file=$OPTARG ;; v) verbose=true ;; ....
「history」命令就是歷史記錄。它顯示了在終端中所執行過的全部命令的歷史
history
注意:按住「CTRL + R」就能夠搜索已經執行過的命令,它能夠你寫命令時自動補全
「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」(Calender),它用來顯示當前月份或者將來或者過去任何年份中的月份
cal cal 02 1835
「copy」就是複製。它會從一個地方複製一個文件到另一個地方
cp file1 file2 cp -r dir1 dir2
快速備份一個文件:
cp some_file_name{,.bkp}
注意: cp,在shell腳本中是最經常使用的一個命令,並且它可使用通配符(在前面一塊中有所描述),來定製所需的文件的複製。
「mv」命令將一個地方的文件移動到另一個地方去。
「mv」命令將一個地方的文件移動到另一個地方去。
「pwd」(print working directory),在終端中顯示當前工做目錄的全路徑。
注意: 這個命令並不會在腳本中常用,可是對於新手,當從鏈接到nux好久後在終端中迷失了路徑,這絕對是救命稻草。
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 "ls -l"
獲取路徑中文件部分
basename resolv.conf #resolv.conf basename /etc/resolv.conf # resolv.conf
比較兩個任意類型的文件並將結果輸出至標準輸出。若是兩個文件相同, ‘cmp‘默認返回0;若是不一樣,將顯示不一樣的字節數和第一處不一樣的位置。
cmp file1 file2 diff file1 file2
‘rm’ 標準移除命令。 rm 能夠用來刪除文件和目錄
rm file1 rm -r dir1 #遞歸刪除空目錄
強刪
rm -rf fileordir
警告: 」rm -rf」 命令是一個破壞性的命令,假如你不當心刪除一個錯誤的目錄。一旦你使用’rm -rf’ 刪除一個目錄,在目錄中全部的文件包括目錄自己會被永久的刪除,因此使用這個命令要很是當心。
‘service‘命令控制服務的啓動、中止和重啓,它讓你可以不重啓整個系統就可讓配置生效以開啓、中止或者重啓某個服務。
注意:要想使用service命令,進程的腳本必須放在‘/etc/init.d‘,而且路徑必須在指定的位置。若是要運行「service apache2 start」實際上實在執行「service /etc/init.d/apache2 start」.
‘man‘是系統幫助頁。Man提供命令全部選項及用法的在線文檔。幾乎全部的命令都有它們的幫助頁
man thecommand
注意:系統幫助頁是爲了命令的使用和學習而設計的。
這是一個很重要的命令,在終端中用來改變本身密碼頗有用。顯然的,由於安全的緣由,你須要知道當前的密碼。
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++是C++的內建編譯器
g++ Add.cpp ./a.out g++ -o Add Add.cpp ./Add
Java 是世界上使用最普遍的編程語言之一. 它也被認爲是高效, 安全和可靠的編程語言. 如今大多數基於網絡的服務都使用Java實現.
javac tecmint.java java tecmint
注意: 幾乎全部的Linux發行版都帶有gcc編譯器, 大多數發行版都內建了g++ 和 java 編譯器, 有些也可能沒有. 你能夠用apt 或 yum 安裝須要的包.
特別有用的特殊文件,位桶,傳送到此文件的數據都會被系統丟棄。
查看變量值
echo $LANG 未設置任何LC_XXX時使用的默認值 echo $LC_ALL 覆蓋全部LC_XXX變量,總控開關
好的作法是,避免爲任何LC_XXX變量賦值,使用LC_ALL和LANG來控制
避免亂碼:從編輯器到語言,再到系統,統一編碼爲UTF-8
bash --version