linux學(xué)習(xí)筆記

基礎(chǔ)命令

主要的命令和快捷鍵

Linux系統(tǒng)命令由三部分組成:cmd + [options]+[operations]

查看和修改ip地址ifconfig和ifconfig eth0 +ip地址

cal日歷

date時間date +%Y%m%d輸出日期的數(shù)字格式,如20160420

bc計(jì)算器

who用戶名字

whoami用戶

lsb_release -a查看系統(tǒng)的版本號

uname -a查看系統(tǒng)的內(nèi)核版本號

history歷史命令記錄

得到root權(quán)限su root

修改root密碼sudo passwd root

關(guān)機(jī)poweroff或者shutdown now

man幫助命令

ls查看目錄里面文件(或者用tree函數(shù))

ls -al其中-l參數(shù)表示要求ls命令列出每個文件的詳細(xì)信息,-a參數(shù)則要求ls命令還要同時列出隱藏文件,-i可以顯示文件的inode即id。

關(guān)于ls -l結(jié)果解釋:drwx-wx-wx,10個字符,第一個字符表示文件的類型,然后每三個字符一組,r代表可讀取權(quán)限,w代表可寫入權(quán)限,x代表可執(zhí)行權(quán)限,若無權(quán)限則用-代替。2~4個字符代表該文件所有者user的權(quán)限,5~7個字符代表給文件所有組的權(quán)限,8~10個字符代表給其他用戶(others)擁有的權(quán)限。

改變文件的權(quán)限:chmod

給某文件添加用戶讀權(quán)限:chmod u+r somefile

給某文件刪除用戶讀權(quán)限:chmod u-r somefile

給某文件添加用戶寫權(quán)限:chmod u+w somefile

給某文件刪除用戶寫權(quán)限:chmod u-w somefile

給某文件添加用戶執(zhí)行權(quán)限:chmod u+x somefile

給某文件刪除用戶執(zhí)行權(quán)限:chmod u-x somefile

添加用戶對某文件的讀寫執(zhí)行權(quán)限:chmod u+rwx somefile

刪除用戶對某文件的讀寫執(zhí)行權(quán)限:chmod u-rwx somefile

給某文件設(shè)定用戶擁有讀寫執(zhí)行權(quán)限:chmod u=rwx somefile

#若想給某文件加上可執(zhí)行權(quán)限:chmod +x somefile

cd一鍵返回用戶主目錄

cd ~等同于cd命令

cd -返回上一次來源的目錄

cd ..返回上級目錄

pwd用戶的當(dāng)前目錄

./用戶的當(dāng)前目錄

../用戶的父級目錄

ctrl+u清空當(dāng)前命令行中輸入的命令

ctrl+shift++號使得teminal終端字體變大

ctrl++號使得teminal終端字體變小

shift+pageup\pagedown在命令行的終端進(jìn)行翻頁

exit退出命令行窗口

touch+文件名可以創(chuàng)建一個文件touch a.txt b.txt c.txt同時創(chuàng)建多個文件

rm+文件名可以刪除文件rm a.txt b.txt c.txt同時刪除多個文件

mkdir+目錄名可以在當(dāng)前目錄下創(chuàng)建一個目錄mkdir dir1 dir2 dir3 ...,同時創(chuàng)建多個子目錄

mkdir -p a/b/c創(chuàng)建層級目錄使用-p選項(xiàng)

rmdir+目錄名刪除空目錄(此目錄下無任何文件或目錄)?????? rmdir dir1 dir2 dir3同時刪除多個子目錄

通配符*匹配任意長度、任意字符

rm *.txt刪除所有的txt文檔rm e.*

強(qiáng)制刪除非空的子目錄:? mkdir -p a/b/c/d/e???????? rm -rf a

Linux系統(tǒng)中沒有回收站,刪除后不可逆

文件的拷貝cp?????? cp src.c src.c.bak備份src.c為src.c.bak

cp src.c a/src.bak將文件src.c拷貝到a目錄下并且修改名字為src.bak

cp src.c a/拷貝不修改名字

文件的移動mv可以實(shí)現(xiàn)文件或目錄的移動或改名字

文件的重命名mv???????? mv src.c.bak src.c修改名字mv a abc修改目錄名字為abc

注:源和目標(biāo)一般在同一級目錄下是修改名字,在不同的目錄下是進(jìn)行移動

3個文本編輯器gedit\ed\nano

cat打印某目錄下的某文件內(nèi)容絕對路徑打印cat /etc/apt/sources.list

gedit文本編輯器,類似于windows里面的txt文本,其中帶有~號的文件為臨時的存儲文本

nano ctrl+o為保持,ctrl+x為退出

tac和cat命令差不多,主要為逆向打印

head默認(rèn)為文件的前面十行參數(shù)為-n

tail默認(rèn)為文件的尾部十行參數(shù)為-n

more對文件進(jìn)行按百分比打印按空格鍵翻頁

less

tar文件打包命令-c創(chuàng)建一個包-v現(xiàn)實(shí)包處理的過程-f必須,無任何含義

tar -cvf ab.tar aa.c shan.e創(chuàng)建一個包

tar -xvf ab.tar解壓一個包

tar -tvf ab.tar查看一個包里面的內(nèi)容

tar -xvf ab.tar shan.e只解壓包里面的shan.e的文件

tar -xvf ab.tar -C kk/將解壓包里面的文件解壓到kk文件夾中

對文件進(jìn)行壓縮

gzip代碼:gzip aa.tar壓縮后aa.tar沒了,得到aa.tar.gz

bzip2代碼:bzip2 aa.tar得到aa.tar.bz2

tar代碼:tar -zcvf ac.tar.gz aa.tar新建一個壓縮包名字為ac.tar.gz

tar -jcvf aa.tar.bz2 ac.tar新建一個壓縮包名字為aa.tar.bz2

解壓命令

gunzip代碼:gunzip aa.tar.gz

bunzip2??????????? bunzip2 aa.tar.bz2

tar????????????????????? tar -zxvf aa.tar.gz? ??tar -jxvf aa.tar.bz2??? tar -ztvf aa.tar.bz2

其中-zxvf為tar命令解壓.gz文件-jxvf為tar命令解壓bz2文件

注:gzip和bzip2以及tar不能通過同樣的后綴名進(jìn)行解壓,必須是經(jīng)過相同的壓縮方式得到的壓縮包,每種壓縮的算法不一樣.

which可以定位可執(zhí)行文件所在目錄which ls??????? which pwd

whereis命令定位文件所在目錄1.二進(jìn)制的-b???? 2.源文件-s???? 3.幫助文檔-m

locate基于數(shù)據(jù)庫通過名字查找文件最新的文件可能查不到,需要手動更新數(shù)據(jù)庫,用命令sudo updatedb更新數(shù)據(jù)庫無論當(dāng)前目錄在哪里都可以查找文件或者文件夾locate aa.tar

file查看文件的類型

find通過文件名查找文件find+查找目錄+查找內(nèi)容

find PATH -name FILENAME

find ./ -name 'a*'在當(dāng)前目錄下查找以a為開頭的文件

find ~/ -name 'a*'在用戶主目錄下查找以a為開頭的文件

三種方式安裝軟件

1.源代碼安裝

2.包安裝.deb包dpkg -i xxx.deb??? sudo dpkg -i包名字

.rpm包rpm -i??? xxx.rpm? sudo rpm -i包名字

3.apt在線安裝sudo apt-get install aptitude -y安裝aptitude軟件

服務(wù)器有?sudo? aptitude search軟件名

本機(jī)安裝過?sudo? aptitude show軟件名

本機(jī)安裝?sudo?? aptitude??? install軟件名

卸載軟件?sudo? aptitude remove軟件名

重新安裝?sudo aptitude reinstall軟件名

安裝tree軟件(一款樹狀結(jié)構(gòu)顯示文件夾內(nèi)容的軟件)安裝sudo aptitude install tree

sources.list里面記錄aptitude可以訪問apt服務(wù)器地址

sudo aptitude update更新sources.list

關(guān)于sources.list的更多源,百度搜索ubuntu 15.10 source.list cn99 lup

軟/硬鏈接

軟鏈接類似windows的快捷方式刪除了主文件快捷方式無用了軟鏈接文件->文件名->磁盤存儲區(qū)域

ln -s源文件名生成軟鏈接名ln -s /etc/apt x將路徑名字賦給x

硬鏈接多個文件名對應(yīng)同一區(qū)域磁盤扇區(qū)塊相當(dāng)于復(fù)制cp

硬鏈接有兩個限制,1.不允許給目錄創(chuàng)建鏈接2.不同分區(qū)上的兩個文件之間不能建立硬鏈接

ln源文件名生成硬鏈接文件名

vim編輯器

vi testvi編輯文件

按i可進(jìn)入vim的編輯模式

按o鍵進(jìn)入下一行

寫完了按ESC鍵

k鍵向上,j鍵向下,h鍵向左,l鍵向右

Ubuntu自帶版本的vi編輯器為vim-tiny缺少左右光標(biāo)鍵和語法高亮的設(shè)置

安裝完整版的vim編輯器sudo aptitude install vim安裝完成

剛剛進(jìn)入vi,vi處于一般操作模式,不可寫入文字,只能進(jìn)行一些操作,稱為操作模式

在操作模式下可以進(jìn)行1)移動光標(biāo)2)拷貝、刪除、粘貼

按下字母i進(jìn)入編輯模式,i在光標(biāo)前插入字符,a在光標(biāo)后插入字符按字母o鍵切換到下一行

k鍵向上,j鍵向下,h鍵向左,l鍵向右

保存文檔,按ESC退回操作模式,再按冒號,進(jìn)入末行命令模式

w為保存,q為退出,q!為舍棄,

gcc -o app ***.c

./app執(zhí)行C語言文件

vim編輯器文件另存為:首先需要按ESC鍵回到命令模式;然后輸入命令:w filename,文件不存在會自動新建文件。用法示例:另存為文件為zhidao.txt??? :w zhidao.txt文件默認(rèn)保存在當(dāng)前工作路徑。

同一文件內(nèi)文本復(fù)制與粘貼的操作

在操作模式下,按o為光標(biāo)下一行插入一行,按shift+o為向上插入一行;

按yy為復(fù)制光標(biāo)所在的行,按nyy為光標(biāo)所在行起復(fù)制n行;

按dd為剪切光標(biāo)所在的行,按ndd為光標(biāo)所在行起剪切n行;

按p為光標(biāo)所在行下面粘貼,按shift+p為光標(biāo)所在行上面粘貼;

vi編輯器中,操作模式時按v鍵進(jìn)入反選模式,從當(dāng)前光標(biāo)進(jìn)入反選,然后對選中的文字進(jìn)行操作。

在操作模式下,按x為刪除字符;

在操作模式下,按r,為替換模式,替換某個字符;

set nu為顯示行號

set nonu為不顯示行號;

syntax on為顯示語法高亮;

syntax off為關(guān)閉語法高亮;

多個文本之間的內(nèi)容拷貝

一、在末行命令中打入e +另一個文件名編輯文件,然后用nyy命令進(jìn)行拷貝,然后在切換,用p命令

二、在末行命令中打入sp+另一個文件名進(jìn)入分屏,然后利用yy和p命令進(jìn)行拷貝和粘貼,ctrl+ww為兩個窗口光標(biāo)切換

三、在末行命令中打入vsp+另一個文件名進(jìn)入分屏,然后利用yy和p命令進(jìn)行拷貝和粘貼,ctrl+ww為兩個窗口光標(biāo)切換

末行命令:wqall為全部存盤退出

vim編輯器中的查找

在操作模式中打入/+需要搜索的內(nèi)容,按n可以切換下一個,N切換上一個

在幫助手冊manul中/+搜索的內(nèi)容

/為從當(dāng)前光標(biāo)向后搜索,?是從當(dāng)前光標(biāo)先前搜索;

vim編輯器中的替換

在操作模式下打入:起點(diǎn),終點(diǎn)s/被替換的字符串/替換成的字符串/g

其中起點(diǎn)和終點(diǎn)是行號

例如:2,9s/int/float/g

全文替換為%s/float/int/g

按u是撤銷操作

%s/float/int/gc對每一個需要替換的字符都要進(jìn)行確認(rèn);

管道函數(shù)

Linux中管道函數(shù)用|來連接兩個命令,它可以把一個命令的輸出內(nèi)容當(dāng)做下一個命令的輸入內(nèi)容,兩個命令之間只需要使用管道符連接即可。

grep

grep [ivnc] '需要匹配的字符'文件名

-i不區(qū)分大小寫

-c統(tǒng)計(jì)包含匹配的行數(shù)

-n輸出行號

-v反向匹配,不包含含有匹配字符的行

grep函數(shù)默認(rèn)區(qū)分大小寫,如需要忽略大小寫,選項(xiàng)-i

sort

sort [-ntkr]文件名

-n采取數(shù)字排序

-t指定分隔符

-k指定第幾列

-r反向排序

對輸出內(nèi)容直接排序時,默認(rèn)按照每行的第一個字母進(jìn)行排序

例子:cat sort.txt | sort -r,按照第一列進(jìn)行排序

cat sort.txt | sort -t ":" -k 2按照第二列進(jìn)行排序,用:分隔符分裂,但是按照名字排序

cat sort.txt | sort -rnt ":" -k 2

按照第二列數(shù)字大小進(jìn)行逆向排序,分隔符為":"

sort -t ":" -k 2 -n sort.txt

uniq

刪除重復(fù)內(nèi)容

uniq [-ic]

-i忽略大小寫

-c計(jì)算重復(fù)行數(shù)

注意:uniq一般和sort的連用,因?yàn)閡niq只會比較相鄰的行,所以必須先排序然后再刪除重復(fù)的行

例如:sort -n uniq.txt | uniq -c

cut

使用cut截取文本

cut -f指定的列-d "分隔符"

例如:cut -f1,6-7 -d':'

想要打印每行第1-5個字符,以及7-10個字符,使用命令:

cut -c1-5,7-10 passwd

tr

做文本轉(zhuǎn)換

主要作用在于文本轉(zhuǎn)換或者刪除

-c用字符串1中字符集的補(bǔ)集替換此字符集,要求字符集為ASCII。

-d刪除字符串1中所有輸入字符。

-s刪除所有重復(fù)出現(xiàn)字符序列,只保留第一個;即將重復(fù)出現(xiàn)字符串壓縮為一個字符串。

例如,將小寫字母轉(zhuǎn)換為大寫字母命令:cat passwd | tr '[a-z]' '[A-Z]'

刪除冒號命令,使用:

cat passwd | tr -d ':'

將文件file中出現(xiàn)的"abc"替換為"xyz"

cat file | tr "abc" "xyz" > new_file

把文件中的數(shù)字0-9替換為a-j

# cat file | tr [0-9] [a-j] > new_file

paste

函數(shù)用于連接兩個文件

paste a.txt b.txt

-d指定在合并文件時行間的分隔符

實(shí)現(xiàn)文本合并cat a.txt b.txt >new

split

分割文件

#按照行進(jìn)行分割,-l參數(shù)制定每500行為一個小文件

split -l 500 big_file.txt small_file_

#分割完成后,當(dāng)前目錄下會生成很多小文件

如果文件是二進(jìn)制的,則只能按照文件大小分割

ll –h big_bin

split –b 64m big_bin small_bin

echo命令

echo為打印某條指令

正則化表達(dá)式與通配符

"."符號

點(diǎn)符號用于匹配除換行符之外的任意一個字符。例如,r.t可以匹配rot,rut,但是不能匹配root。

例:grep 'r..t' /etc/passwd

"*"符號

"*"符號用于匹配前一個字符0次或者任意多次,比如ab*,可以匹配a、b、abb等。"*"號經(jīng)常和"."號一起使用,比如”.*”代表任意長度的不包含換行的字符。

例如:”r.*t”代表查找包含字母r,后面緊跟任意長度的字符,再跟一個字母t的行。

“\{n,m\}”符號

雖然”*”可用于重復(fù)匹配前一個字符,但卻不能精確的控制匹配的重復(fù)次數(shù),使用“\{n,m\}”符號則能達(dá)到要求。

“\{n\}”符號匹配前面的字符n次,“\{n,\}”匹配前面的字符至少n次以上(含n次)。

“\{n,m\}”匹配前面的字符n到m次。

“^”符號

這個符號用于匹配開頭字符的行

例如:grep ‘^root’ /etc/passwd

“$”符號

用于匹配結(jié)尾字符的行

例如:grep ‘^r.*h$’ /etc/passwd

符號“^$”則代表改行為空

“[ ]”符號

用于匹配方括號內(nèi)出現(xiàn)的任一字符。用符號“-”作限定

例如:[A-Za-z]匹配所有的字母,[^A-D]代表取反即除了字母A-D以外的字母,例如:“^1[38][0-9]\{9\}”代表手機(jī)號碼

“\”符號

為轉(zhuǎn)義符。比如[ \- ]此時”\-”代表“-”,再如想打入一個點(diǎn),則\.*代表匹配任意長度的點(diǎn)號。

“\<”符號和“\>”

這兩個符號分別用于界定單詞的左邊界和右邊界。

比如“\”則用于匹配以”hello”結(jié)尾的單詞。

“\<\>”則用于精確匹配任意一個字符串。

例如:grep “\”

\n為換行符,\r為一個回車符,\t為一個制表符,\f為一個換頁符,\s為任何空白字符,\S為任何非空白字符。

擴(kuò)展的正則表達(dá)式

在使用這些擴(kuò)展符號前需要使用命令egrep。

“?”符號

“?”符號用于匹配前一個字符0次或1次,所以”ro?t”僅能匹配rot或者rt.

“+”符號

“+”符號用于匹配前一個字符1次以上,所以”ro+t”就可以匹配rot、root.

“|”符號

“|”符號是”或”的意思,即多種可能的羅列

例如:^0[0-9]\{2\}-[0-9]\{8\} | ^0[0-9]\{3\}-[0-9]\{8\}

“|”符號

“()”符號通常和”|”符號連用,用于枚舉一系列可替換的字符。

例如021-88888888和0511 88888888可以使用代碼:^0[0-9]\{2,3\}(-| )[0-9]\{8\}

再如:h(ar|oo|ol)d可以匹配hard, hold或hood

特殊的POSIX字符,示例如下:

grep支持一類特殊的POSIX字符:

[:alnum:]文字?jǐn)?shù)字字符

[:alpha:]文字字符

[:digit:]數(shù)字字符

[:graph:]非空字符(非空格、控制字符)

[:lower:]小寫字符

[:cntrl:]控制字符

[:print:]非空字符(包括空格)

[:punct:]標(biāo)點(diǎn)符號

[:space:]所有空白字符(新行,空格,制表符)

[:upper:]大寫字符

[:xdigit:]十六進(jìn)制數(shù)字(0-9,a-f,A-F)

例如:搜索以數(shù)字開頭的行:grep ^[[:digit:]] zzbds.txt

注意:需要多加上一層中括號

通配符

“*”符號

“*”符號代表0個或多個字符。比如*.doc代表所有以.doc結(jié)尾的文件。A*.doc代表以字母A開頭的doc文件。

“?”符號

“?”符號代表的是任意的一個字符,例如A?.doc代表的是以字母A開頭,文件名第二個字母為任意字母的doc文件。

“{}”符號

可以匹配所有括號內(nèi)包含的以逗號隔開的字符。

例如:ls –l {A,B,C}.doc和命令ls –l [A-C].doc列出所有以字母A,B,C開頭.doc結(jié)尾的文件

嵌套功能:ls –l {[A-Z]*.doc,[0-9]??.txt}

“^”符號和“!”符號

這兩個符號往往和”[]”一起使用,當(dāng)出現(xiàn)在”[]”中的時候,代表取反。

文本處理工具sed

sed處理文本時是以行為單位的,每處理完一行就立即打印出來,然后再處理下一行,直至全文處理結(jié)束。sed可做的編輯動作包括刪除、查找替換、添加、插入、從其他文件中讀入數(shù)據(jù)等。

sed命令使用的場景包括以下:

常規(guī)編輯器編輯困難的文本。

太過于龐大的文本,使用常規(guī)編輯器難以勝任(比如vi一個幾百兆的文件)

有規(guī)律的修改文本,加快文本的處理速度

sed修改文件流的方式如下:sed [options] ‘command’ file

# ‘command’命令均為vi編輯器中的命令

# sed命令默認(rèn)不修改原文件,如果希望保存修改后的文件則需要用重定向’>’

#使用-e參數(shù)和分號連接多編輯命令

例如:sed –e ‘s/this/That/g’ –e ‘s/line/LINE/g’ sed.txt或者sed ‘s/this/That/g’ ; ‘s/line/LINE/g’ sed.txt

刪除

sed ‘1d’ sed.txt >save.txt #刪除第一行

sed ‘1,3d’ sed.txt #刪除1到3行

sed ‘1,$d’ sed.txt #刪除1到最后一行

sed ‘$d’ sed.txt? #刪除最后一行

sed ‘5!d’ sed.txt? #只保留第五行

sed ‘/Empty/d’ sed.txt #刪除所有包含Empty的行

sed ‘/^$/d’ sed.txt #刪除空行

查找替換

使用s命令可將查找到的匹配文本內(nèi)容替換為新的文本。

sed ‘s/line/LINE/’ sed.txt? #將line替換為LINE,每行默認(rèn)替換一個

sed ‘s/line/LINE/2’ sed.txt? #將line替換為LINE,每行默認(rèn)替換兩個

sed ‘s/line/LINE/g’ sed.txt? #將line替換為LINE,全部替換

sed ‘s/^this/That/’ sed.txt? #只替換開頭的this為That

#命令中間不能有空格

字符轉(zhuǎn)換

使用y命令可進(jìn)行字符轉(zhuǎn)換,其作用為將一系列字符逐個的變換為另外一系列字符,基本用法如下:

sed ‘y/OLD/NEW/’ file? #將全文中字母O替換為N,字母L替換為E,字母D替換為W.

插入文本

使用i或者a命令插入文本,其中i代表在匹配行之前插入,而a代表在匹配行之后插入.

sed ‘2 i Insert’ sed.txt? #在第二行之前插入文本

sed ‘2 a Insert’ sed.txt? #在第二行之后插入文本

sed ‘/Second/ i \Insert’? #在匹配行之前插入文本

讀入文本

使用命令r可以從其他文件中讀取文本,并插入匹配行之后.

sed ‘/^$/r? /etc/passwd’ sed.txt? #將/etc/passwd中的內(nèi)容讀取到sed.txt空行之后

打印

使用p命令可進(jìn)行打印,這里使用sed命令時一定要加參數(shù)-n,表示不打印沒關(guān)系的行。

例:sed –n ‘1p’ sed.txt? #只打印第一行

#sed實(shí)際處理了第二行,其他幾行由于沒有匹配所以并未真正處理。

再如:sed –n ‘s/the/THE/gp’ sed.txt #只打印實(shí)際處理過的行,簡化了輸出,第二行the全部轉(zhuǎn)換為THE

寫文件

sed本身默認(rèn)并不改寫原文件,而只是對緩沖區(qū)的文本做了修改并輸出到屏幕。所以想保存文件,除了使用重定向或-i,還可以使用w命令將結(jié)果保存到外部指定文件。

例如:sed –n ‘1,2 w output’ sed.txt #這里沒有任何的輸出,因?yàn)檩敵霰恢囟ㄏ虻轿募utput

#將sed.txt文件中1,2行寫入文件output中

sed腳本

將動作靜態(tài)化的寫到某個文件中,然后調(diào)用sed命令并使用-f參數(shù)指定該文件。

vi sed.rules

s/this/THAT/g

/^$/d

sed sed.rules sed.txt

高級替換

替換匹配行的下一行,使用n命令

例如:sed ‘/^${n;s/line/LINE/g}’ sed.txt

文本處理工具awk

awk是基于列的處理工具,它的工作方式是按行讀取文本并視為一條記錄,每條記錄以字段分割成若干字段,然后輸出各字段的值。awk認(rèn)為文件都是結(jié)構(gòu)化的,也就是說都是由單詞和各種空白字符組成的,“空白字符”包括空格、tab、連續(xù)的空格和tab等。每個非空白的部分叫做域,從左到右依次是第一個域,第二個域。$1,$2表示第一域第二個域,$0表示全部域。

打印指定的域

#打印第一個和第四個列awk ‘{print $1,$4}’ awk.txt

#打印全部內(nèi)容awk ‘{print $0}’ awk.txt

指定打印的分隔符

默認(rèn)情況下awk是使用空白字符作為分隔符的,但是也可以通過-F參數(shù)指定分隔符來區(qū)分不同的域(類似于cut命令).

注意:必須得使用單引號不能使用雙引號.

例如:awk –F’.’ ‘{print $1,$2}’ awk.txt

打印每行的列數(shù)內(nèi)部變量NF參數(shù)

awk ‘{print NF}’ awk.txt? #打印每行的列數(shù),指定不同的分隔符會有不同結(jié)果

打印固定域

在NF前加上$符號,則代表最后一列,這樣不管有多少列,只要使用$NF就能打印出最后一行。倒數(shù)第二行為$(NF-1)

例如:awk ‘{print $NF}’ awk.txt awk ‘{print $(NF-1)}’ awk.txt

截取字符串

使用substr函數(shù)對指定域截取字符串

substr(指定域,第一個開始字符的位置,第二個結(jié)束的位置)

#其中第二個結(jié)束的位置可以為空,這樣默認(rèn)輸出到該域的最后一個字符

例如:cat awk.txt | awk ‘{print substr($1,6,2)}’ #輸出第一個域從第六個字符開始長度為2的字段

內(nèi)部變量length

使用內(nèi)部變量length可以確定字符串的長度

例如:cat awk.txt | awk ‘{print length}’

使用awk求列和

例如: cat awk.txt | awk ‘BEGIN{total=0}{total+=$3}END{print total}’ #求年齡的和

cat awk.txt | awk ‘BEGIN{total=0}{total+=$3}END{print total/NR}’ #求年齡的平均值

NR為內(nèi)部變量,表示已經(jīng)讀取的記錄數(shù)

Shell編程

第一個例子:

vi HelloWorld.sh

輸入:#!/bin/bash

#this is a comment

echo ‘HelloWorld!’

:wq保存退出

運(yùn)行:在當(dāng)前目錄下bash HelloWorld.sh

或者改變文件的執(zhí)行權(quán)限,chmod +x HelloWorld,然后打入./HelloWorld運(yùn)行

Shell的內(nèi)建命令

1.如何確定內(nèi)建命令:type

判斷一個命令是否是內(nèi)建命令使用type函數(shù)

例如:type cd

:cd is a Shell builtin

2.執(zhí)行程序:”.”

使用點(diǎn)號執(zhí)行沒有加權(quán)限的腳本可以正常運(yùn)行

. ./HelloWorld.sh? #兩個點(diǎn)之間需要加一個空格,否則../代表當(dāng)前目錄的上一層目錄

3.別名alias

alias可用于創(chuàng)建命令的別名,若直接輸入該命令且不帶任何參數(shù),則列出當(dāng)前用戶使用了別名的命令。

創(chuàng)建命令的別名如下:

alias myShutdown =’shutdown –h now’

該命令只能在當(dāng)前的Shell環(huán)境有效,重新登錄則消失??蓪⒃摋l目寫到用戶目錄的.bashrc文件中

4.刪除別名:unalias

unalias ll

5.任務(wù)前后臺切換:bg,fg,jobs

6.改變目錄:cd

7.聲明變量declare,typeset

8.打印字符:echo

echo用于打印字符,典型用法是使用echo命令并跟上使用雙引括號的內(nèi)容,-n命令可以使得不打印換行符。

9.跳出循環(huán)break

10.控制循環(huán):continue

13.退出shell:exit

14.環(huán)境變量聲明export

例如:export var=1

16.整數(shù)運(yùn)算:let

17.當(dāng)前目錄顯示:pwd

18.聲明局部變量:local

19.從標(biāo)準(zhǔn)輸入讀取一行到變量:read

20.定義函數(shù)返回值:return

21.向左移動位置函數(shù):shift

變量賦值和取值

變量名=變量名

注意1:變量名和變量名之間用等號緊緊相連,之間沒有任何的空格

注意2:當(dāng)變量中有空格時必須用引號括起,否則會出現(xiàn)錯誤

變量的取值只需要在變量前加上$符號即可,嚴(yán)謹(jǐn)?shù)膶懛ㄊ?{}

注意3:當(dāng)變量值引用的是其他變量,則必須使用雙引號,因?yàn)閱我枙柚箂hell解釋特殊字符$,例如john=1;name=”$john”,echo $name結(jié)果為1

取消變量unset

例如:name=john; echo $name ;unset name注意:unset+變量名不需要$符號

取消函數(shù):

unset_funciont(){echo “Hello World!”

}

unset unset_function

特殊參數(shù)

位置參數(shù):腳本本身為$0,第一個參數(shù)為$1,第二個參數(shù)為$2,第三個為$3,以此類推。當(dāng)參數(shù)大于9時,需要用括號${}將其括起來標(biāo)識;$#表示腳本參數(shù)的個數(shù)總和,$@或者$*表示腳本的所有參數(shù)。$?永遠(yuǎn)是上一個命令的返回值。

數(shù)組

數(shù)組的定義:declare –a Array; Array[0]=0;Array[1]=1;Array[2]=”HelloWorld”

數(shù)組還可以在創(chuàng)建的同時賦值declare –a Name=(‘john’ ‘sue’);Name[2]=’Wang’

或者直接不使用declare關(guān)鍵字:Name=(‘john’ ‘sue’)

注意:輸入數(shù)據(jù)時候一定要用空格將其分開,逗號不行。

還可以給特定的元素賦值。Score=([3]=3 [5]=5 [7]=7)

數(shù)組操作

1.最簡單的操作就是數(shù)組取值,其格式為:${數(shù)組名[索引]}

例如:echo ${Array[0]}

指定索引只能列舉單個元素,要是想一次性取出所有元素的值,可以采取兩種方式:

echo ${Array[@]}或者echo${Array[*]}

注意:echo ${Array[@]}得到的是以空格隔開的元素值,而echo ${Array[*]}得到的是一整個字符串。

2.數(shù)組的長度,即元素的個數(shù)

利用@或者*字符,可以將數(shù)組擴(kuò)展成列表,然后使用#號來獲取數(shù)組元素的個數(shù)。

例如:echo ${#Array[@]}或者echo ${#Array[*]}

3.數(shù)組截?。嚎梢越厝∧硞€元素的一部分,對象可以是真?zhèn)€數(shù)組或者某個元素。

#取出數(shù)組的第一、二個元素

echo ${Array[@]:1:2}

#取出第二個元素從0個字符開始連續(xù)5個字符

echo ${Array[2]:0:5}

4.連接數(shù)組:將若干個數(shù)組進(jìn)行拼接操作

Conn=(${Array[@]} ${Name[@]})

5.替換元素:將數(shù)組內(nèi)某個元素的值替換成其他值。

${數(shù)組名[@或#]/查找字符/替換字符}

Array=(${Array[*]/HelloWorld/HelloJohn})

echo ${Array[*]}

6.取消數(shù)組或者元素:和取消變量一樣,取消一個數(shù)組的方式也是用unset命令。

unset Array[1] #取消第二個元素

unset Array? #取消數(shù)組

只讀變量

只讀變量又稱為常量,是通過readonly內(nèi)建命令創(chuàng)建的變量。這種變量在聲明時候就要求賦值,并且之后無法更改,這和之前講到的使用declare –r聲明只讀變量的效果是一樣的。

# readonly RO=100

RO=200? #會報錯

轉(zhuǎn)義符和引用

shell中的轉(zhuǎn)義符是反斜線”\”,使用轉(zhuǎn)義符的目的是使轉(zhuǎn)義符后面的字符單純的作為字符出現(xiàn)。

例如,想要打印字符$Array,使用命令echo $Array,由于變量Array并未賦值,故打印的是空的,此處應(yīng)該加上轉(zhuǎn)義符,即echo \$Array,結(jié)果顯示$Array

常見的特殊符號

引用

引用是指將字符串用某種括號括起來,以防止特殊字符被解析為其他意思。

1.部分引用

部分引用是指用雙引號括起來的引用。在這種引用方式中,$符號、`引號,轉(zhuǎn)義符(\)這三種特殊字符依然會被解析為特殊的意義。

例如:var=”A?? B?? C”

如果輸入echo $var,則輸出的內(nèi)容只保留了每個字母間一個空格

如果想要完全的按照格式保留原來的變量,打入echo “$var”

2.全引用

全引用是指用單引號括起來的引用。單引號中的任何字符都只當(dāng)做是普通字符(除了單引號本身,也就是說單引號中間無法在包含單引號,即便轉(zhuǎn)義符轉(zhuǎn)義單引號也不行)。

例如:echo ‘$var’如果想輸出變量$var,則需要使用雙引號。

命令替換

命令替換是指將命令的標(biāo)準(zhǔn)輸出作為值賦給某個變量。

使用的方式有兩種。

1.使用反引號` , `命令`

2.使用$(),$(命令)

注意:如果被引用的命令輸出的內(nèi)容包括多行,此時若不通過雙引號引用的方式輸出變量,則輸出的內(nèi)容中將會刪除換行符,文件名之間會使用系統(tǒng)默認(rèn)的空來填充,即輸出的內(nèi)容只占一行。

例如:var=$(ls -l); echo $var; echo “$var”

運(yùn)算符

shell中的運(yùn)算符主要有比較運(yùn)算符(用于整數(shù)比較)、字符串運(yùn)算符(用于字符串測試)、文件操作運(yùn)算符(用于文件測試)、邏輯運(yùn)算符、算數(shù)運(yùn)算符、位運(yùn)算符、自增自減少運(yùn)算符。

使用$[]做運(yùn)算

x=1;y=2;echo $[x+y];

使用bc做運(yùn)算

在Linux下使用bc的最簡單的方式是直接輸入命令bc。

#bc默認(rèn)情況下并不顯示小數(shù)部分,需要設(shè)置顯示的小數(shù)位數(shù),scale=3設(shè)置為三位小數(shù)輸出。

比較運(yùn)算:2>1 ?? 2<1???????? 1==1?????? 1&&2???? 1&&0???? 1||0???????? 1||2???????? !0

例如:希望一次性處理多個計(jì)算

cat cal.bc

12*34;34/12;scale=3;34/12;a=1;b=2;a+b

cat cal.bc | bc

echo ‘scale=100;sqrt(3)’ |bc

有時候需要在shell程序里面直接調(diào)用bc計(jì)算表達(dá)式,并將結(jié)果復(fù)制給變量以參與后面的計(jì)算或者判斷。這里給出了一個求和的例子:

#!/bin/bash

num1=10

num2=15

total=$(echo “num1+num2”|bc)

echo $total

shell中的特殊字符

通配符

常見的通配符有*、?和[]括起來的字符序列。

引號

引號包括單引號和雙引號,單引號又叫做“全引用”或“強(qiáng)引用”;雙引號又稱為“部分引用”或者“弱引用”,所有用雙引號括起來的字符除了美元符號、反斜線、反引號依然保留用途外,其他的字符都作為普通字符處理;而所有的單引號括起來的部分都作為普通字符處理,但是要注意單引號中間不能再出現(xiàn)單引號,否則shell會無法判別到底哪里是單引號的氣質(zhì)位置。

注釋符

shell使用#作為注釋符。但是如果#號后面出現(xiàn)!,則不會作為注釋符。

反引號

反引號用于命令替換,和$()的作用相同,表示返回當(dāng)前命令的執(zhí)行結(jié)果并賦值給變量。

測試和判斷

使用$?來進(jìn)行判斷。

判斷為真則返回0,為假則返回非0。

測試結(jié)構(gòu)

第一種方式:test expression

第二種方式:使用[ expression ],[]中間有兩個空格

判斷一個文件是否存在,例如:

test –e /var/messages

echo $?

字符串測試

shell中的字符串比較主要有等于、不等于、大于、小于、是否為空等測試。

字符串測試

說明

-z “string”

字符串string為空時返回真,否則為假

-n “string”

字符串string非空時返回真,否則為假

“string1”=” string2”

字符串string1和string2相同時返回為真,否則為假

“string1”!=” string2”

字符串string1和string2不同時返回為真,否則為假

“string1”>” string2”

按照字典排序,字符串string1排在string2之前返回為真,否則為假

“string1”<” string2”

按照字典排序,字符串string1排在string2之后返回為真,否則為假

例如:str1=””?????? str2=”hello”??? test –z “$str1”??????? [ “$str1”=”$str2” ]? [ “$str1”\>”$str2” ]

如果不想使用轉(zhuǎn)義符,則可以使用[[]]括起來表達(dá)式

整數(shù)比較

比較兩個整數(shù)的大小關(guān)系

測試成立返回0,否則則返回非0數(shù)值。

測試方法一:test “num1” num_operator “num2”

測試方法二:[ “num1” num_operator “num2” ]

其中num_operator是整數(shù)測試符常見的整數(shù)測試符如下:

整數(shù)比較

說明

“num1” –eq “num2”

如果兩個值相等則返回真,否則返回假。equal

“num1” –gt “num2”

如果大于則返回真,否則返回假。great than

“num1” –lt “num2”

如果小于則返回真,否則返回假。less than

“num1” –ge “num2”

如果大于等于則返回真,否則返回假。great equal

“num1” –le “num2”

如果小于等于則返回真,否則為假。less equal

“num1” –ne “num2”

如果不等于返回真,否則返回假。not equal

邏輯測試符和邏輯運(yùn)算符

邏輯測試用于連接多個測試文件,并返回整個表達(dá)式。邏輯測試主要有邏輯非、邏輯與、邏輯或三種。

邏輯測試表如下:

邏輯運(yùn)算

說明

!expression

如果expression為真,則測試結(jié)果為假

expression1 –a expression2

expression1和expression2同時為真,則測試結(jié)果為真,否則為假

expression1 –o expression2

expression1和expression2只要有一個為真,則結(jié)果為真,同時都假則結(jié)果為假

[! –e /var/log/messages]和[-e /var/log/messages01]

[! –e /var/log/messages –a –e /var/log/messages01]

或者采用以下的寫法:

! [ -e /var/log/messages ] && [ -e /var/log/messages01 ]? #記得加上空格

if判斷結(jié)構(gòu)

語法結(jié)構(gòu)如下:

if expression; then

command

fi

如果expression測試返回真,則執(zhí)行command。如果要執(zhí)行的不止一條命令,則不同命令用換行符隔開,如下所示:

if expression;then

command1

command2

fi

例子:

#!/bin/bash

echo -n "Please input a score:"

read SCORE

if [ "$SCORE" -lt 60 ];then

echo "C"

fi

if [ "$SCORE" -lt 80 -a "$SCORE" -ge 60 ];then

echo "B"

fi

if [ "$SCORE" -ge 80 ];then

echo "A"

fi

if/else判斷結(jié)構(gòu)

if/else判斷結(jié)構(gòu)語法結(jié)構(gòu):

if expression;

then??????? command

else???????? command

fi

#!/bin/bash

#讀兩個數(shù),判斷這兩個數(shù)是否相等

read x y

if [ $x -eq $y ];

then echo "$x=$y"

else echo "$x!=$y"

fi

#多層嵌套

#!/bin//bash

echo –n “Please input a score:”

read SCORE

if [ “$SCORE” –lt 60 ];then

echo “C”

else if [“$SCORE” –lt 80 –a “$SCORE” –ge 60 ];then

echo “B”

else if [“$SCORE” –ge 80 ];then

echo “A”

fi

fi

fi

換種寫法

#!/bin//bash

echo –n “Please input a score:”

read SCORE

if [ “$SCORE” –lt 60 ];then

echo “C”

elif [“$SCORE” –lt 80 –a “$SCORE” –ge 60 ];then

echo “B”

else [“$SCORE” –ge 80 ];then

echo “A”

fi

case判斷結(jié)構(gòu)

用case來做多分支的結(jié)構(gòu)語法結(jié)構(gòu)如下:

case VAR in

var1)?????? command1 ;;

var2)?????? command2 ;;

var3)?????? command3 ;;

*)??? command;;

esac

其原理為從上到下依次比較VAR和var1\var2\var3的值是否相等,如果匹配相等則執(zhí)行后面的命令語句,在無一匹配的情況下匹配最后默認(rèn)的*,并執(zhí)行后面的默認(rèn)命令。要注意的是,case判斷結(jié)構(gòu)中的var1\var2\var3等這些值只能是常量或正則表達(dá)式。

循環(huán)

for循環(huán)語法結(jié)構(gòu)

for var in (list)

do

command

done

#這里的列表是一系列以空格分隔的值。shell每次從這個列表中取出一個值,然后運(yùn)行do/done之間的命令,直到取完列表中的所有的值。

#!/bin/bash

for I in 1 2 3 4 5 6 7 8 9

do

echo $i

done

注意:for循環(huán)里面可以in (list)也可以in ${數(shù)組[*]},之前可以先定義一個列表變量或者數(shù)組變量。

#!/bin/bash

fruits=”apple orange banana pear” #此處也可以定義為fruits=(apple orange banana pear)

for fruit in ${fruits}?????????????????????????? #此處應(yīng)該改為for fruit in ${fruits[*]}

do

echo “$fruit is John’s favourite”

done

echo “No more fruits”

seq命令用于產(chǎn)生一個整數(shù)數(shù)列。seq 5 = 1 2 3 4 5

默認(rèn)從1開始,步長為1

格式為:seq起始數(shù)字步長結(jié)束數(shù)字

例子:

#!/bin/bash

sum=0

x=$(seq 1 2 100)

for i in ${x}

do

let “sum+=i”#或者代碼sum=$[sum+i]或者sum=$((sum+i))

done

echo $sum

Cfor循環(huán)

shell支持類C的for循環(huán),具體結(jié)構(gòu)為:

for((i=1;i<=10;i++))

do

echo –n “$i”? #此處echo加上選項(xiàng)-n是不換行打印

done

echo

while循環(huán)

while循環(huán)的語法結(jié)構(gòu)為:

while expression

do

command

done

首先while將測試expression的返回值,如果返回值為真則執(zhí)行循環(huán)體,返回值為假則不執(zhí)行循環(huán)。循環(huán)完后進(jìn)入下一次循環(huán)之前再次測試。

#!/bin/bash

count=5

while [ $count –gt 0 ]

do

echo –en “$count\n”

let count=count-1

done

#注意:echo打印函數(shù)默認(rèn)是每行打印一個元素,-n選項(xiàng)使得不換行,-e選項(xiàng)激活轉(zhuǎn)義符\

#注意:[]和[[]]的區(qū)別在于[]中間使用-a –o這種邏輯符號,而[[]]則使用&& ||這種邏輯連接符號

#注意:運(yùn)算符號有三種let expression、$[expression]、$((expression))

echo $?就是輸出上次腳本的退出碼。如果是0說明上次腳本執(zhí)行成功,如果非0說明上次腳本執(zhí)行失敗。

例子

#!/bin/bash

sum1=0

sum2=0

i=1

while [ $i -le 100 ]

do

let sum1=sum1+i

if [[ $(($i%2)) -ne 0 ]];then

let sum2=sum2+i

fi

let i=i+1

done

echo -en "sum1=$sum1\nsum2=$sum2\n"

使用while按行讀取文件

cat student.txt

john 30 boy

sue 28 girl

wang 25 boy

xu 23 girl

#!/bin/bash

while read LINE

do

NAME=`echo $LINE |awk '{print $1}'`

AGE=`echo $LINE |awk '{print $2}'`

SEX=`echo $LINE |awk '{print $3}'`

echo "My name is $NAME ,I'm $AGE years old ,I'm a $SEX ."

done < student.txt

until循環(huán)

until循環(huán)的語法結(jié)構(gòu)為:

until expression

do

command

done

例子

#!/bin/bash

sum1=0

sum2=0

i=1

until [ $i -gt 100 ]

do

let sum1=sum1+i

if [[ $(($i%2)) -ne 0 ]];then

let sum2=sum2+i

fi

let i=i+1

done

echo -en "sum1=$sum1\nsum2=$sum2\n"

函數(shù)

shell中函數(shù)的語法結(jié)構(gòu)為:

function FUNCTION_NAME( ){

command1

command2

}

#打印Hello的例子

#!/bin/bash

function sayHello(){

echo “Hello”

}

echo “Call function sayHello”

sayHello

#判斷文件是否存在在例子

#!/bin/bash

FILE=/etc/notExistFile

function checkFileExist(){

if [ -f $FILE ];then

return 0

else

return 1

fi

}

echo “Call function checkFileExist”

checkFileExist

if [ $? –eq 0 ];then

echo “$FILE exist”

else

echo “$FILE not exist”

fi

帶參數(shù)的函數(shù)

#!/bin/bash

FILE=/etc/notExistFile

function checkFileExist(){

if [ -f $FILE ];then

return 0

else

return 1

fi

}

echo “Call function checkFileExist”

checkFileExist $1

if [ $? –eq 0 ];then

echo “$FILE exist”

else

echo “$FILE not exist”

fi

#執(zhí)行腳本時候,輸入bash checkFileExist.sh /etc/passwd后面加上參數(shù)

下面是接受兩個參數(shù)的例子:

#!/bin/bash

function power(){

x=1

y=0

if [[ $2 –gt $y ]];then

for((i=1;i<=2;i++))

do

let “x=x*$1”

done

fi

echo $x

}

power $1 $2

#運(yùn)行bash power.sh 2 2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容