shell基礎腳本

echo -e "\e[1;42m this is test \e[0m"            'this is test'會被彩色打印,其中顏色由42m決定
echo -n this is test                    'this is test'不會被換行
printf "%-4s %-5.1f\n"    wade 3.1            wade 3.1分別按照左對齊打印出來,並採用4s和5.1f格式


pgrep gedit                        可以查看到gedit的進程ID

export命令用來設置環境變量。至此以後,從當前shell腳本執行的任何程序都會繼承這個變量
export PATH="$PATH:/home/user/bin"            在PATH中新加一條路徑

var=1234567890
length=${#var}
echo $length                        獲得變量的長度

echo $SHELL或者echo $0                    識別當前的shell版本

echo $UID                        如果結果爲0,標示當前爲root用戶

echo $PS1                        顯示當前bash的提示字符串,其中\u爲用戶名,\h爲主機名,\w爲當前的工作目錄。

可以利用\e[1;32m設置彩色提示字符串



算數操作:

no1=4
no2=5
let result=no1+no2                    let命令可以直接執行基本的算數操作
let no1+=6
echo $result
echo $no1

result=$[no1+no2]
result=$[no1+100]                    可以使用[]操作符,和let命令類似

result=$((no1+10))                    也可以使用(())操作符,但是變量名之前需要加上$

result=`expr 3 + 4`
result=$(expr $no1+5)                    expr也可以用作類似算數操作

echo "4 * 0.45" | bc                    bc執行浮點數運算
echo "scale=2;3/8" | bc                    scale設置小數精度,scale=2表示將小數位個數設置爲2

no=100
echo "obase=2;$no" | bc                    利用obase進行進制轉換
no=1100100
echo "obase=10;ibase=2;$no" | bc            obase和ibase配合進行進制轉換

echo "sqrt(100)" | bc                    sqrt計算平方根
echo "10^10" | bc                    ^計算平方


文本描述符:
0    stdin
1    stdout
2    stderr

echo "this is test" >temp.txt
echo "this is test 1" >>temp.txt            >等同於1>;>>等同於1>>

當命令輸出錯誤信息時,stderr信息就會被打印出來。當一個命令發生錯誤並退回時,它會返回一個非0的退出狀態;而當命令成功完成後,它會返回數字0。
退出狀態可以從特殊變量$?中獲得。

ls + 2>out.txt                        將錯誤輸出到out.txt文件中
cmd 2>stderr.txt 1>stdout.txt                將stderr單獨定向到一個文件中,將stdout重定向到另一個文件中
cmd &>output.txt                    將stderr和stdout都被重定向到同一個文件中

command | tee [-a] FILE1 FILE2                在終端中打印,並將它重定向到文件FILE1和FILE2.-a表示爲追加內容選項

exec 3<input.txt                    exec命令創建自定義的文件描述符




數組和關聯數組
array_var=(1,2,3,4,5)                    定義數組,以0位起始索引
array_var[0]="test"                    自定義數組
echo ${array_var[0]}                    打印出特定索引的數組元素內容
echo ${array_var[*]}                    打印所有數組的內容
echo ${#array_var[*]}                    打印數組長度

declare -A ass_array                    定義關聯數組
ass_array=([index1]=val1 [index2]=val2)            內嵌索引-值列表法
ass_array[index1]=val3                    獨立的索引-值
echo ${ass_array[index1]}                打印index1索引對應的值
echo ${!ass_array[*]}                    列出數組索引


alias new_command='command sequence'            創建新的別名。要想永久保存,需要將其放入到~/.bashrc文件中。若想刪除只需要使

用unalias命令或者從~/.bashrc中刪除


tput cols                        獲取終端的行數
tput lines                        獲取終端的列數
tput longname                        打印出當前終端名
tput setb [0-7]                        設置終端背景色
tput bold                        設置字體爲粗體

echo -e "Enter password: "
stty -echo                        禁止將輸出發送到終端
read password
stty echo                        允許發送到終端
echo
echo Password read



date                            顯示日期
date +%s                        以紀元時顯示時間,主要用途是做時間差的秒數
date --date "jan 20 2011" +%s                按照給定日期顯示紀元時
date --date "jan 20 2011" +%A                按照給定日期顯示是星期幾
%A    星期
%B    月
%d    日
%D    固定格式日期(mm/dd/yy)
%Y    年
%H    小時
%M    分鐘
%S    秒
%N    納秒
%s    紀元時
date "+%d %B %Y"                    按照指定格式打印時間
date -s "21 june 2015 11:12:23"                設置日期和時間



bash -x script.sh                    使用-x選項,啓動跟蹤調試shell腳本。打印出所執行的每一行命令以及當前狀態
set -x        在執行時顯示參數和命令
set +x        禁止調試
set -v        當命令進行讀取時顯示輸入
set +v         禁止打印輸入
#!/bin/bash -xv                        在/bin/bash啓動xv,可以啓用調試功能




function fname()
{
    statements;                    自定義函數。或者去掉function也可以
}

fname                            執行函數
fname arg1 arg2                        執行函數,傳遞參數
$1是函數的第一個參數
$2是函數的第二個參數
$@是打印所有參數
$*是以單個實體的方式打印所有參數

遞歸函數
F()
{
echo $1;
F HELLO;
SLEEP 1;                        SLEEP表示休眠1秒鐘
}

導出函數
export -f fname                        導出函數,擴展函數的作用域。可以擴展到子進程


FORK炸彈
:() {:|:&};:                        該函數能夠調用自身,不斷的生成新的進程,最終造成DDOS***

ls | cat -n >out.txt                    列出當前目錄下的內容,cat -n追加行號存到out.txt文件中

pwd
(cd /bin;ls)                        利用()定義一個子shell
pwd


read -n 2 var                        讀取2個字符並存入變量var中
read -s var                        以不回顯的方式存入變量
read -p "enter input:" var                顯示提示信息
read -t timeout    var                    在特定時限內讀取輸入
read -d "定界符" var                    用定界符結束輸入行


IFS(內部字段分隔符)        默認爲空

for循環
for var in list;
do
commands
done

for ((i=1;i<10;i++));
do
commands
done

echo {1..50}                        生成一個1到50的數字列表
echo {a..z}                        生成a..z的列表

while循環
while condition
do
commands
done

until循環
x=0;
until [$x -eq 9]
do
let x++;echo $x
done



if 條件;then
commands;
fi

if 條件;then
commands;
elif conditions;
then
commands;
else
commands;
fi

[condition] && action                    如果條件爲真,則執行action
[condition] || action                    如果條件爲假,則執行action



條件判斷:
算術比較
-eq    等於
-ne    不等於
-gt    大於
-lt    小於
-ge    大於或等於
-le    小於或等於
-a    邏輯與
-o    邏輯或

文件系統相關測試
-f $var    判斷var變量是否有文件
-x    判斷是否有可執行文件
-d    目錄
-e    文件是否存在
-c    字符設備文件
-b    塊設備文件
-w    文件是否可寫
-r    文件是否可讀
-L    是否有符號鏈接

字符串比較
[[ $str1 = $str2 ]]                    當str1等於str2時,返回真。就是str1和str2包含的文本是一模一樣的
[[ $str1 == $str2 ]]                    檢查字符串是否相等
[[ $str1 != $str2 ]]                    字符串不同則返回真
[[ $str1 > $str2 ]]                    字符串1的字母序大於字符串2,返回真
[[ $str1 < $str2 ]]                    字符串1的字母序小於字符串2,返回真
[[ -z $str1 ]]                        若str1爲空,返回真
[[ -n $str1 ]]                        若str1內容爲非空,則爲真

if [ $var -eq 0 ];then echo "true";fi
can be written as
if test $var -eq 0;then echo "true";fi            可以用test命令替代[]符號






cat 1.sh 2.sh                        拼接1.sh和2.sh文件內容
cat -s 1.sh                        -s選項壓縮1.sh中的連續的空白行
cat 1.sh | tr -s '\n'                    利用tr移除空白行
cat -T 1.sh                        將1.sh中的製表符標記成^|



script -t 2> timing.log -a output.session        timing.log用於存儲時序信息,描述命令在何時運行。output.session用於存儲命令輸出
exit                            退出錄製終端會話
scriptreplay timing.log output.session            播放錄製終端會話

Terminal1輸入以下命令:
mkfifo    scriptfifo
Terminal2輸入以下命令:
cat scriptfifo
返回terminal1,輸入以下命令:
script -f scriptfifo                    
commands;
exit                            當退出時,終端1變成廣播員,終端2變成聽衆

find . -print                        當前目錄下打印出匹配文件的文件名(路徑)。其中'\n'作爲用於分隔文件的定界符
find . -print0                        '\0'作爲定界符

find . -iname "example*" -print                尋找當前目錄下example開頭的文件,忽略大小寫,並打印出來
find . \( -name "*.txt" -o -name "*.pdf" \) -print    尋找匹配多個條件中的一個並打印
find . -path "*slynus*" -print                尋找符合slynus路徑
find . -regex "*slynus*" -print                以正則表達式的方式尋找路徑
find . ! -name "*.txt" -print                當前目錄下不是以txt爲後綴的文件
find . -maxdepth 1 -type f -print            maxdepth參數指定尋找最大深度
find . -mindepth 2 -type f -print            mindepth參數指定尋找最小深度

-atime    訪問時間    用戶最近一次訪問文件的時間
-mtime    修改時間    文件內容最後一次被修改的時間
-ctime    變化時間    文件元數據(例如權限或所有權)最後一次被改變的時間
其中-表示小於,+表示大於
-amin    訪問時間    以分鐘爲計時
-mmin    修改時間
-cmin    變化時間
-newer    比較時間    需找比指定文件更新的所有文件

find . -type f -size +2k                尋找當前目錄下文件大小大於2k的文件.
find . -type f -size -2k
find . -type f -size 2k
還可以用b/c/w/k/m/g代替k

find . -type f -name "*.txt" -delete            刪除匹配的文件
find . -type f -perm 644 -print                基於文件權限匹配
find . -type f -user slynux  -print            基於文件所有權匹配

find . -type f -user root -exec chown slynux {} \;    利用exec和{}可以結合find執行命令或動作
本例的意思是將所有的符合文件全部更改其所有權爲slynux用戶.其中{}表示爲所有符合條件的集合
find . -type f -mtime +10 -name "*.txt" -exec cp {} OLD \;
find devel/source_path \( -name ".git" -pruns \) -o \( -type f -print \)  該命令表示打印出不包括在.git目錄中的所有文件的名稱(路徑).使用關鍵字pruns




xargs命令把從stdin接收到的數據重新格式化,再將其作爲參數提供給其他命令
cat example.txt | xargs                    xargs將多行輸入轉換成單行輸出。將'\n'符轉換成" "(空格)

cat example.txt    | xargs -n 3                指定每行最大的參數數量n,每個參數都是由" "(空格)隔開

echo "splitXsplitXsplitXsplit" | xargs -d X -n 2    利用-d選項指定分隔符,默認爲IFS作爲分隔符

#cecho.sh
echo $*'#'                        定義一個文件,當參數被傳遞給文件後,它會將這些參數打印出來,並以#字符作爲結



#args.txt
args1
args2
args3

cat args.txt | xargs -n 1 ./cecho.sh            當需要每次提供一個參數時,指定n=1
cat args.txt | xargs     ./cecho.sh            當需要每次提供所有參數時
INPUT | xargs -n X                    每次執行腳本需要X個參數的命令時

./cecho.sh -p arg1 -l
./cecho.sh -p arg2 -l                    arg部分是唯一的可變文本

cat args.txt | xargs -I {} ./cecho.sh -p {} -l        利用-I選項配合{}指定了替換字符串,可以實現上面的執行命令

find . -type f -name "*.txt" -print0 | xargs -0 rm -f    刪除匹配的文件,其中\0作爲輸入定界符。

find source_code_dir_path -type f -name "*.c" -print0 | xargs -0 wc -l        統計源代碼目錄中所有C程序文件的行數



tr只能通過stdin,而無法通過命令行參數來接受輸入。
tr [options] set1 set2
將來自stdin的輸入字符從set1映射到set2,並輸出到stdout。若set2的長度小於set1,則set2會不斷重複其最後一個字符,直到長度與set1相同。如果set2的

長度大於set1,那麼在set2中超出set1長度的那部分字符則完全被忽略

echo "HELLO WORLD WHO IS THIS" | tr 'A-Z' 'a-z'        將輸入字符由大寫轉換成小寫

echo 12345 | tr '0-9' '9876543210'            加密
echo 87654 | tr '9876543210' '0-9'            解密

echo "hello 123 world 456" | tr -d '0-9'        利用-d選項刪除字符。本例結果爲hello world

echo hello 1 char 2 next 4 | tr -d -c '0-9 \n'        利用-c選項使用字符的補集,將去除非set1中出現的所有字符。本例結果爲 1 2 4

echo "ssssss" | tr -s 's'                利用-s選項壓縮字符。本例壓縮s,結果爲s

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

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




md5sum 1.sh > 1.md5                計算1.sh的校驗和(32字符,十六進制)並保存到1.md5文件中

md5sum -c 1.md5                    利用生成的文件覈實數據完整性

md5sum *.md5                    用所有的.md5信息來檢查所有的文件

sha1sum 1.sh > 1.sha1                計算1.shd點校驗和(40字符,16進制)

md5deep -rl directory_path > directory.md5    計算目錄的校驗和。r表示遞歸,l表示使用相對路徑。需要安裝md5deep軟件包

md5sum -c directory.md5                覈實目錄



sort file1.txt file2.txt > sort.txt        利用sort將一組文件進行排序

cat sort.txt | uniq > uniq.txt            利用uniq找出已排序文件中不重複的行

sort -n file.txt                按數字進行排序

sort -r file.txt                按逆序進行排序

sort a.txt -o a.txt                對a.txt的文件排序                        

sort -M months.txt                按月份進行排序

sort -nC file.txt                檢查是否按照數字進行排序

sort -m sorted1 sorted2                合併兩個排過序的文件,而且不需要對合並後的文件再進行排序

sort -nrk 1 data.txt                -k指定了排序應該按照哪一個鍵(列號)來進行排序。

sort -u unsort.txt                只顯示唯一的行
uniq -u unsort.txt                只顯示唯一的行

sort unsort.txt | uniq -c            統計各行在文件中出現的次數

sort unsort.txt | uniq -d            找出文件中重複的行

sort data.txt | uniq -s 2 -w 2            -s指定可以跳過前n個字符,-w指定用於比較的最大字符數

uniq -z file.txt                用uniq命令生成包含0值字節終止符的輸出

uniq -z file.txt | xargs -0 rm            刪除指定的文件



temp_file=$(tempfile)                爲變量temp_file賦值了一個臨時文件名
temp_file="/tmp/file-$RANDOM"            加帶了隨機數的文件名作爲臨時文件名

echo $RANDOM                    總是返回一個隨機數

temp_file="/tmp/var.$$"                生成帶當前運行腳本的進程ID的臨時文件




dd if=/dev/zero bs=100k count=1 of=data.file    生成一個大小爲100KB的測試文件

split -b 10k data.file                將文件分割爲多個大小爲10k的文件

split -b 10k data.file -d -a 4            -d參數指定以數字爲後綴,-a參數指定後綴長度

split -b 10k data.file -d -a 4 split_file    指定每個分割文件的前綴爲split_file

split -l 10 data.file                -l選項指定分割文件僅有10行

csplit server.log /SERVER/ -n 2 -s {*} -f server -b "%02d.log";rm server00.log
/SERVER/    用來匹配某一行,分割過程即從此開始
{*}        表示根據匹配重複執行分割,直到文件末尾爲止。{整數}指定分割執行的次數
-s        使命令進入靜默模式,不打印其他信息
-n        指定分割後的文件名後綴的數字個數
-f        指定分割後的文件名前綴
-b        指定後綴格式
因爲分割後的第一個文件沒有任何內容,所以刪除第一個文件



file_jpg="sample.jpg"
name=${file_jpg%.*}                利用$操作符可以將名稱部分從“名稱.擴展名”這種格式的文件名中提取出來
echo File name is :$name

var=hack.fun.book.txt
echo    ${var%.*}    -->hack.fun.book        從右到左    
echo    ${var%%.*}    -->hack                %%符號執行非貪婪匹配

echo    ${var#*.}    -->fun.book.txt            從左到右
echo    ${var##*.}    -->txt                ##符號執行非貪婪匹配


extension=${file_jpg#*.}                利用#操作符可以將擴展名部分提取出來
echo Extension is : $extension



rename *.jpg *.JPG                    將*.jpg更名爲*.JPG

目錄/usr/share/dict包含了一些詞典文件

命令aspell來覈查某個單詞是否在字典中

look android    filepath                返回filepath路徑中以android開頭的文件/目錄

read -p "Enter number:" no                將輸入內容賦值給變量no

交互式自動化:expect
#!/bin/bash
#文件名:interactive.sh
read -p "Enter number:" no
read -p "Enter name:" name
echo you have entered $no,$name;

#!/usr/bin/expect
#文件名:automate_expect.sh
spawn ./interactive.sh                    spawn參數指定需要自動化哪一個命令
expect "enter number:"                    expect參數提供需要等待的消息
send "1\n"                        send是要發送的消息
expect "enter name:"
send "hello\n"
expect eof                        expect eof指明命令交互結束



comm a.txt b.txt                    比較A.TXT和B.TXT的文件。輸出的第一列包含只在a.txt中出現的行,第二列只包含在b.txt中出

現的行,第三列包含共同出現的行
comm a.txt b.txt -1 -2                    -1從輸出中刪除第一列,-2從輸出中刪除第二列,-3從輸出中刪除第三列

用戶特殊權限:S
setuid權限允許用戶以其擁有者的權限來執行可執行文件,即使這個可執行文件是由其他用戶運行的
用戶組特殊權限:S
setgid位允許以同該目錄擁有者所在組相同的有效組權限來允許可執行文件,但是這個組和實際發起命令的用戶組未必相同
其他用戶特殊權限:T/t
粘滯位(sticky bit)。當一個目錄設置了粘滯位,只有創建該目錄的用戶才能刪除目錄中的文件,即使用戶組和其他用戶也有寫權限
如果沒有設置執行權限,但是設置了粘滯位,那麼使用t;如果同時設置了執行權限和粘滯位就使用T

chmod a+t directory_name                設置粘滯位
chmod 777 . -R                        以遞歸的方式設置權限
chown user.group . -R                    以遞歸的方式設置所有權
chmod +s executable_file                以不同的用戶運行可執行文件
chmod u+s file                        置位setuid
chmod g+s file                        置位setgid

chattr +i file                        將文件file設置爲不可修改
chattr -i file                        將文件file重新設置爲可修改

touch -a file                        只更改文件訪問時間
touch -m file                        只更改文件內容修改時間
touch -d "Fri Jun 25 10:20:12 IST 2012" file        -d爲時間戳指定特定的時間和日期

ln -s target symbolic_link_name                創建軟連接symbolic_link_name-->target

file filename                        顯示文件類型信息
file -b filename                    顯示不包括文件名在內的文件類型信息





環迴文件系統是指那些在文件中而非物理設備中創建的文件系統

創建一個1G大小的文件
dd if=/dev/zero of=loopbackfile.img bs=1G count=1

格式化這個文件
mkfs.ext4 loopbackfile.img

檢查文件系統
file loopbackfile.img

掛載環迴文件
mkdir /mnt/loopback
mount -o loop loopback/img  /mnt/loopback

在內部,這個環迴文件連接到一個名爲/dev/loop1或者loop2的設備上,手動操作如下
losetup /dev/loop1        loopback.img
mount  /dev/loop1      /mnt/loopback

將ISO文件作爲環迴文件掛載
mkdir    /mnt/iso
mount -o loop linux.iso    /mnt/iso

通過sync立即應用更改
sync



創建ISO鏡像
從/dev/cdrom創建一個ISO鏡像
cat /dev/cdrom > image.iso

創建鏡像的最好方法是用dd工具
dd if=/dev/cdrom of=image.iso

mkisofs命令創建iso文件系統
mkisofs -V "Label" -o image.iso source_dir/
    -V指定了ISO文件的的卷標,source_dir是作爲ISO文件內容來源的目錄路徑




能夠啓動閃存或硬盤的混合ISO
isohybrid命令把標準ISO文件轉換成混合ISO
isohybrid        image.iso  ->可用於寫入USB存儲設備
將ISO寫入USB存儲設備
dd if=image.iso   of=/dev/sdb1


命令行刻錄ISO
cdrecord -v  dev=/dev/cdrom  image.iso
    -speed  速度          指定刻錄速度
    -multi        刻錄方式採用多區段



玩轉CD ROM托盤
eject          彈出光驅托盤
eject -t          合上光驅托盤





查找文件差異並進行修補
diff  -u  version1.txt version2.txt    以一體化形式輸出差距,version2.txt中沒有version1.txt的文件被顯示。+表示是新加入的行,-表示是刪除的行

diff -u version1.txt version2.txt > version.patch 將diff的輸出重定向到一個文件

patch命令配合version.patch,當應用與version1時,就可以得到version2
patch -p1 version1.txt  < version.patch        此時version1的內容和version2相同
patch -p1 version1.txt  < version.patch        再次輸入該命令撤銷修改

生成目錄的差異信息
diff  -Naur   directory1  directory2  
    -N:將所有缺失的文件視爲空文件
    -a:將所有文件視爲文本文件
    -u:生成一體化輸出
    -r:遍歷目錄下的所有文件





head   -n  4 file    指定打印前幾行
head   -n  -N file    打印除了最後N行之外的所有行
seq  11   |  head -n -5        打印除了最後五行之外的所有行
seq  100  | head -n  5    打印前五行

tail       -n  5 file    打印後五行
tail       -n  +(N+1)    打印除了前N行之外的所有行
seq 100 | tail -n +6    打印第六行到第一百行
tail   -f   file    動態顯示文件




查看當前路徑下的目錄
ls -d  */



用pushd和popd快速定位
pushd和popd可以用於在多個目錄之間進行切換而無需複製粘貼。pushd和popd是以棧的方式來運作,後進先出。
pushd  /var/www        壓入路徑
pushd  /usr/src        壓入路徑
pushd  /etc        壓入路徑
查看棧內容
dirs
切換目錄
pushd  +3    每條路徑的編號是以0開始,從左到右
移除棧內容
popd            當前目錄被移除
popd    +3        將第三個移除
cd -            切換到上個目錄



統計行數
wc -l  file    
統計單詞數
wc  -w  file
統計字符數
wc  -c   file
默認顯示行數、單詞數和字符數
wc  file
打印最長行的長度
wc  file  -L




打印目錄樹
tree    -/unixfs        樹狀UNIX文件系統
tree    path     -P    pattern     用通配符描述樣式
tree    path    -I    pattern    只重點標出除符合樣式之外的文件
tree    -h            同時打印出文件和目錄的大小
tree    PATH    -H    http://localhost   -o  out.html    以html形式輸出目錄樹




grep  match_pattern  filename     從文件中搜索

grep  word  filename  --color    重點標記處匹配到的單詞

grep -E "[A-Z]+"  或者  egrep "[A-Z]+"    正則表達式查找

grep word -o file            -o選項只輸出匹配到文本部分
grep  -v  word  file            -v選項打印除了匹配外的所有行
grep  -c  word  file            -c統計匹配行的數量

grep -c word file | wc -l        wc -l配合-c可以統計匹配項的數量
grep -n word file            -n選項包含匹配字符串的行數
grep  word file  -R -n        -R遞歸搜索

grep -i word  file            -i忽略大小寫

grep -e word1 word2 file        -e匹配多個樣式

grep dir --include  word        --include搜索中包含文件

grep dir --exclude word        --exclude搜索排除文件
                --exclude-dir
                --exclude-from FILE





cut按列切分文件

cut -f 2,3    filename            提取filename文件中2、3列
cut -f 3 --complement file        提取除了第三列外的所有列
cut -f 3 -d ";" file            -d指定了定界符

cut -c 1-5 file            打印前5個字符
cut -c -5 file            打印前5個字符
-c    表示字符
-b    表示字節
-f    表示定義字段
N-    從第N個字節到行尾
N-M    從第N個到第M個
-M    從第一個到第M個

cut -c1-3,6-9 file    --output-delimiter ","    指定輸出定界符




sed入門
sed 's/pattern/replace_string/'  file    替換給定文本中的字符串

sed -i 's/pattern/replace_string/'  file    將替換結果應用於原文件

sed '/s/pattern/replace_string/g'  file    替換所有符合內容

sed 's/pattern/replace/Ng' file    從第N+1處替換

sed '/^$/d'  file            移除空白行

sed 's/\w\+/[&]/g'        &對應於之前所匹配到的單詞

sed 'expr1' | 'expr2'    組合多個表達式


awk入門
awk  'BEGIN{print "start"}  pattern {commands}  END {print  "end"}'  file

工作方式:
1,執行BEGIN {commands}語句塊中的語句
2,從文件中或stdin中讀取一行,然後執行pattern {commands}。重複這個過程,直到文件全部被讀取完畢
3,當讀至輸入流末尾時,執行END {commands} 語句塊
三個語句塊都是可選的

echo -e "line1\nline2" | awk 'BEGIN{print "start"} {print} END{print "END"}'      結果如下:
start
line1
line2
end

特殊變量
NR:表示記錄數量
NF:表示字段數量
$0:這個變量包含執行過程中當前行的文本內容
$1:這個變量包含第一個字段的文本內容
$2:這個變量包含第二個字段的文本內容





迭代文件中的每一行
while read line;
do
echo $line;
done < file.txt
或者
cat file.txt | (while read line;do echo $line;done)

迭代一行中的每一個單詞
for word in $line;
do
echo $word;
done
迭代文件中的每一行的每一個單詞
while read line;
do
    for word in $line;
    do
    echo $word;
    done
done < file.txt

迭代一個單詞中的每一個字符
for ((i=0;i<${#word};i++))
do
echo ${word:i:1};
done



按列合併文件
paste  file1 file2
paste  file1 file2  -d ","    指定定界符,默認爲製表符
按行合併文件
cat  file1  file2


打印文件或行中的第n個單詞或列
awk '{print $1}' file
ls -l | awk '{print $1 ":" $4}'


打印不同行或樣式之間的文本
awk  'NR==M,NR==N'  filename    打印m行到n行文本
awk  '/start_pattern/, /end_pattern/' filename    打印pattern之間的文本


郵件的正則表達式
[a-zA-Z0-9.]+@[a-zA-Z0-9.]+\.[a-zA-Z]{2,4}



文本切片與參數操作
var="this is a line"
echo ${var/line/replace}    -->this is a replace

${variable_name:start_position:length}        -->指定字符串的起始位置和長度來生成子串
string=abcdefghijklmnopqrstuvwxyz
echo ${string:4}        -->efghijklmnopqrstuvwxyz
echo ${string:4:8}        -->efghijkl
echo ${string:(-1)}        -->x
echo ${string:(-2):2}    -->yx





網站下載
wget    url    下載網頁或遠程文件
wget url1 url2
wget ftp://baidu.com/somfile.jpg
wget ftp://baidu.com/somfile.jpg  -o log -O 1.jpg  -o表示日誌,-O表示指定輸出文件名
wget  -t  5  rul    -t指定重試次數
wget  --limit-rate  20k  url    限速下載
wget  -Q 100m url        指定下載最大限額
wget  -c     url        斷點續傳
curl   url            下載網頁
wget  --mirror   url        複製或鏡像整個網站
wget  --user  username  --password  pass url    訪問需要認證的HTTP或FTP頁面


以格式化純文本形式下載網頁
lynx  -dump  url > webpage_as_text.txt    將網頁以ASCII字符的形式下載到文本文件中



用curl設置cookie
curl  url  --cookie  "user=slynx;pass=hack"
將cookie另存爲一個文件
curl  url  --cookie-jar   cookie-file
用curl設置用戶代理字符串
curl  url  --user-agent  "Mozilla/5.0"    設置用戶代理爲IE
限定curl可佔用的帶寬
curl  url  --limit-rate  20k
指定最大下載量
crul  url  --max-filesize  30k
用curl進行認證
curl  -u  user:pass  url




tar -cvf output.tar  source1 source2    創建包
tar -rvf output.tar  new_file        追加文件
tar -tvf  output.tar            列出包裏的內容
tar -xvf  output.tar            提取包裏的內容
tar -Af  file1.tar  file2.tar        拼接兩個包文件
tar -f    output.tar  --delete file1 file2    從包文件中刪除文件
tar -zcvf  output.tar.gz  source        gzip格式壓縮
tar -jcvf   output.tar.bz2  source        bz2格式壓縮
tar -cvf --lzma  output.tar.lzma        lzma格式壓縮
tar -cf  output.tar  * --execlude "*.txt"    從歸檔中排除部分文件



用cpio歸檔
echo  file1 file2 | cpio -ov > archive.cpio

gzip  filename    壓縮文件,只能壓縮一個文件
gunzip  filename.gz    解壓縮文件
zcat  filename.gz        讀取壓縮文件內容
gzip  -9  filename        壓縮率
    1級的壓縮率最低,但是壓縮速度最快
    9級的壓縮率最高,但是壓縮率最慢


bzip2 filename        壓縮文件
bunzip2 filename.bz2    解壓縮文件
bunzip2 filename.bz2 -k    解壓縮文件,保留原文件
bzip2 filename -k        壓縮文件,保留原文件


lzma  filename        壓縮文件
unlzma  filename.lzma    解壓縮文件
lzma  filename -k        壓縮保留原文件
lzma -9 filename        壓縮率


超高壓縮率的squashfs文件系統
mksquashfs  sources  compressedfs.squashfs    創建squashfs文件
mkdir  /mnt/squash
mount -o loop  compressedfs.squashfs  /mnt/squash

加密工具與散列
crypt   input_file   output_file    接受文件以及口令
crypt   passphrase  inputfile  encrypted_file
crypt  passphrase -d encrypted_file > outputfile  解密文件

gpg  -c  filename            加密文件
gpg  filename.gpg            解密文件





列出網絡上的所有活動主機
方法一:
for ip in 192.168.0.{1..255};
do
    ping $ip -c 2 &> /dev/null;
    if [ $? -eq 0 ];
    then
        echo $ip is alive
    fi
done
方法二:
fping  -a  192.168.0.1/24 -g 2> /dev/null
或者
fping  -a 192.168.0.1 192.168.0.255 -g



傳輸文件
lftp  username@ftphost
    cd directory    改變目錄
    lcd          改變本地主機的目錄
    mkdir        創建目錄
    get filename    下載文件
    put filename    上傳文件

sftp username@domainname
sftp -oPort=422    user@domainname    SSH端口不是默認的22時,需要指定端口

scp source destination    安全複製文件
scp  filename    user@remotehost:/path
其中src和dst都可以採用形如username@localhost:/path的形式
scp -r filename     user@remotehost:/path    遞歸複製


iwconfig命令用來爲無線網卡配置合適的無線網絡
iwlist scan命令可以掃描並列出可用的無線網絡


lsof -i        列出系統中的開放端口以及運行在端口上的服務的詳細信息
netstat -lntp        查看開放端口與服務


計算命令執行時間
time  command        計算命令的執行時間
    real時間表示掛鐘時間,命令開始到結束的時間
    user時間是指進程花費在用戶模式中的cpu時間,真正用於執行進程的時間
    sys時間是指進程花費在內核模式中的cpu時間
    


watch監視命令
watch ls    在某段時期內以固定的間隔時間不斷監視某個命令的輸出
watch -n 5 'ls -l'    -n指定輸出的時間間隔
watch -d 'ls -l'    -d指定命令輸出差異

對文件及目錄訪問進行記錄
inotifywait -m -r -e create,move,delete /dev/ -q




wall命令用來向所有當前登陸用戶的終端寫入消息
echo  "test123" | wall
wall < message



查看主機名
hostname    或者uname -n
打印linux內核版本、硬件架構等詳細信息
uname -a
打印內核發行版本
uname -r
打印主機類型
uname -m
打印CPU相關信息
cat /proc/cpuinfo
打印內存的詳細信息
cat /proc/meminfo
打印系統的分區信息
cat /proc/partions


cron表的格式,從左到右依次是
分鐘(0-59)、小時(0-23)、天(1-31)、月份(1-12)、工作日(0-6)、命令

創建cron表:
crontab -e -u user
查看cron表:
crontab -l
移除cron表:
crontab -u user -r






$0    查看當前shell
$?    命令的返回狀態,正常退出爲0;非正常退出爲非0
$1    執行腳本時的參數
$PS1    當前bash提示字符串
$$    當前進程ID
$UID    爲0表示爲root






























發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章