日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

5233杨光--Linux第一次实验

發(fā)布時(shí)間:2023/12/10 linux 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 5233杨光--Linux第一次实验 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

學(xué)習(xí)計(jì)時(shí):共14小時(shí)

讀書:2小時(shí)

代碼:7小時(shí)

作業(yè):2小時(shí)

博客:3小時(shí)

一、學(xué)習(xí)目標(biāo)

1. 能夠獨(dú)立安裝Linux操作系統(tǒng) ? 2. 能夠熟練使用Linux系統(tǒng)的基本命令 ? 3.?熟練使用Linux中用戶管理命令/系統(tǒng)相關(guān)命令/文件目錄相關(guān)命令/打包壓縮相關(guān)命令/比較合并相關(guān)命令/網(wǎng)絡(luò)相關(guān)命令等 4.?熟練應(yīng)用“搜索”進(jìn)行舉一反三的學(xué)習(xí)

二、學(xué)習(xí)資源

1. 課程資料:https://www.shiyanlou.com/courses/413???實(shí)驗(yàn)一,課程邀請碼:W7FQKW4Y

2.?Linux 基礎(chǔ)入門:https://www.shiyanlou.com/courses/1(重點(diǎn),第一次課考核內(nèi)容全部從這里面出)

3.??Linux命令:en? ?cn

三、學(xué)習(xí)方法

1.??進(jìn)度很重要:必須跟上每周的進(jìn)度,閱讀,練習(xí),問答,項(xiàng)目。我會(huì)認(rèn)真對待每一位同學(xué),請你不要因?yàn)槔щy半途而廢。

2. 問答很重要:遇到知識難點(diǎn)請多多提問,這是你的權(quán)利更是您對自己負(fù)責(zé)的義務(wù)。問答到博客園討論小組:http://group.cnblogs.com/103791/ 3. 實(shí)踐很重要:解決書中習(xí)題,實(shí)踐書中實(shí)例,完成每周項(xiàng)目,才算真的消化了這本好書。通過實(shí)驗(yàn)樓環(huán)境或自己安裝的虛擬機(jī)在實(shí)踐中進(jìn)行學(xué)習(xí) 4. 實(shí)驗(yàn)報(bào)告很重要:詳細(xì)記錄你完成項(xiàng)目任務(wù)的思路,獲得老師點(diǎn)評和幫助自己復(fù)習(xí)。學(xué)習(xí)完成后在博客園中(http://www.cnblogs.com/)把學(xué)習(xí)過程通過博客發(fā)表,博客標(biāo)題“信息安全系統(tǒng)設(shè)計(jì)基礎(chǔ)第一周學(xué)習(xí)總結(jié)”

四、學(xué)習(xí)任務(wù)

(提示:請將要求學(xué)生完成的任務(wù)、測驗(yàn)或思考題列在此處)

1. 重點(diǎn)學(xué)習(xí) cheat/find/locate/grep/man/whereis/which/apt-get

? ?查找?guī)椭臋n、各種示例多多練習(xí),這幾個(gè)命令會(huì)貫穿我們整個(gè)學(xué)習(xí)的學(xué)習(xí),掌握這幾個(gè)命令就可以很好學(xué)習(xí)其他命令了。

2. 這學(xué)期需要掌握的命令有ac,apt-get,bzip2,cat,chgrp,chmod,chown,clear,compress,cp,dd,df,diff,du,dump,evn,find,finger,free,grep,gzip,head,kill,less,ln,locate,l,gout,ls,man,mkdir,more,mount,mt,mv,netstat,nslookup,od,passwd,patch,ps,pstop,pwd,rm,shell,sort,ssh,stty,tail,tar,telnet,touch,tree,uname,unzip,vi,vim,whereis,which,who,write等

3. 測試示例:

  • 請?jiān)谔摂M機(jī)中安裝DDD軟件(其他軟件)
  • 請演示怎么判斷DDD軟件能不能安裝
  • 請查找系統(tǒng)中50M以上的文件
  • 請查找系統(tǒng)中兩天前修改過的且小于5M的文件
  • 請問如何查找操作系統(tǒng)的信息
  • 請查找當(dāng)前目錄下所有*.c文件中哪個(gè)文件中包含main函數(shù)
  • 請建立一個(gè)目錄,里面建立兩個(gè)子文目錄,如何一條命令刪除三個(gè)目錄?
  • 如何把一個(gè)目錄及子目錄拷貝到自己的主目錄中
  • ...

?

、后續(xù)學(xué)習(xí)預(yù)告(可選):

Linux下C語言編程基礎(chǔ): VIM進(jìn)行編輯 GCC進(jìn)行編譯 GDB進(jìn)行調(diào)試 Make進(jìn)行自動(dòng)化

、學(xué)習(xí)過程

?

1. 重要知識點(diǎn)總結(jié)梳理:

  1.操作系統(tǒng):是系統(tǒng)調(diào)用和內(nèi)核那兩層,當(dāng)然直觀的來看,我們使用的操作系統(tǒng)還包含一些在其上運(yùn)行的應(yīng)用程序,比如文本編輯器,瀏覽器,電子郵件。

  2.最初的操作系統(tǒng)當(dāng)時(shí)的操作系統(tǒng)能運(yùn)行批處理程序。批處理程序不需要用戶的交互,它從文件或者穿孔卡片讀取數(shù)據(jù),然后輸出到另外一個(gè)文件或者打印機(jī)。

二十世紀(jì)六十年代初,交互式操作系統(tǒng)開始流行。它不僅僅可以交互,還能使多個(gè)用戶從不同的終端同時(shí)操作主機(jī)。這樣的操作系統(tǒng)被稱作分時(shí)操作系統(tǒng)。

  3.Linux 系統(tǒng)還提供了一個(gè)叫做終端模擬器的程序(Terminal),下面幾個(gè)比較常見的終端模擬器,例如 gnome-terminal,kconsole,xterm,rxvt,kvt,nxterm 和 eterm,

  4.Unix/Linux 操作系統(tǒng)下的 Shell 既是用戶交互的界面,也是控制系統(tǒng)的腳本語言。在 UNIX/Linux 中比較流行的常見的 Shell 有 bash,zsh,ksh,csh 等等,Ubuntu 終端默認(rèn)使用的是 bash,默認(rèn)的桌面環(huán)境是 GNOME 或者 Unity(基于 GNOME),但我們的環(huán)境中使用的分別是zsh 和 xfce。

  5.1).重要快捷鍵:

  真正學(xué)習(xí)命令行之前,你先要掌握幾個(gè)十分有用,必需掌握的小技巧:

  [Tab]

  使用Tab鍵來進(jìn)行命令補(bǔ)全,Tab鍵一般鍵盤是在字母Q旁邊,這個(gè)技巧給你帶來的最大的好處就是當(dāng)你忘記某個(gè)命令的全稱時(shí)你可以只輸入它的開頭的一部分然后按下Tab鍵就可以得到提示或者幫助完成:

?

  [Ctrl+c]

  你就可以使用Ctrl+c鍵來強(qiáng)行終止當(dāng)前程序(你可以放心它并不會(huì)使終端退出)。

其他一些常用快捷鍵

按鍵???????? 作用

Ctrl+d ???? 鍵盤輸入結(jié)束或退出終端

Ctrl+s ???? 暫停當(dāng)前程序,暫停后按下任意鍵恢復(fù)運(yùn)行

Ctrl+z ???? 將當(dāng)前程序放到后臺運(yùn)行,恢復(fù)到前臺為命令fg

Ctrl+a ???? 將光標(biāo)移至輸入行頭,相當(dāng)于Home鍵

Ctrl+e ???? 將光標(biāo)移至輸入行末,相當(dāng)于End鍵

Ctrl+k ???? 刪除從光標(biāo)所在位置到行末

Alt+Backspace 向前刪除一個(gè)單詞

Shift+PgUp 將終端顯示向上滾動(dòng)

Shift+PgDn 將終端顯示向下滾動(dòng)

  2).學(xué)會(huì)利用歷史輸入命令

  你可以使用鍵盤上的方向上鍵,恢復(fù)你之前輸入過的命令。

  3).學(xué)會(huì)使用通配符

  通配符是一種特殊語句,主要有星號(*)和問號(?),用來對對字符串進(jìn)行模糊匹配(比如文件名,參數(shù)名)。當(dāng)查找文件夾時(shí),可以使用它來代替一個(gè)或多個(gè)真正字符;當(dāng)不知道真正字符或者懶得輸入完整名字時(shí),常常使用通配符代替一個(gè)或多個(gè)真正的字符。

?

  建立多個(gè)文件的快捷方式

Shell 常用通配符:

字符???????? 含義

* ????????????? 匹配 0 或多個(gè)字符

? ????????????? 匹配任意一個(gè)字符

[list] ??????? 匹配 list 中的任意單一字符

[!list] ????? 匹配 除list 中的任意單一字符以外的字符

[c1-c2] ??? 匹配 c1-c2 中的任意單一字符 如:[0-9] [a-z]

{string1,string2,...} 匹配 sring1 或 string2 (或更多)其一字符串

{c2..c2} ? 匹配 c1-c2 中全部字符 如{1..10}

?

4).學(xué)會(huì)在命令行中獲取幫助

?

在 Linux 環(huán)境中,如果你遇到困難,可以使用man?命令,它是Manual page的縮寫。獲得某個(gè)命令的說明和使用方式的詳細(xì)介紹:

?

情況下,man 手冊里面的內(nèi)容都是英文的,這就要求你有一定的英文基礎(chǔ)。man 手冊的內(nèi)容很多,涉及了 Linux 使用過程中的方方面面,為了便于查找,是做了分冊(分區(qū)段)處理的,在Research UNIX、BSD、OS X 和 Linux 中,手冊通常被分為8個(gè)區(qū)段,安排如下:

區(qū)段???????? 說明

1 ???? 一般命令

2 ???? 系統(tǒng)調(diào)用

3 ???? 庫函數(shù),涵蓋了C標(biāo)準(zhǔn)函數(shù)庫

4 ???? 特殊文件(通常是/dev中的設(shè)備)和驅(qū)動(dòng)程序

5 ???? 文件格式和約定

6 ???? 游戲和屏保

7 ???? 雜項(xiàng)

8 ???? 系統(tǒng)管理命令和守護(hù)進(jìn)程

要查看相應(yīng)區(qū)段的內(nèi)容,就在 man 后面加上相應(yīng)區(qū)段的數(shù)字即可,通常 man 手冊中的內(nèi)容很多,你可能不太容易找到你想要的結(jié)果,不過幸運(yùn)的是你可以在 man 中使用搜索,/<你要搜索的關(guān)鍵字>,查找到后你可以使用n鍵切換到下一個(gè)關(guān)鍵字所在處,shift+n為上一個(gè)關(guān)鍵字所在處。使用Space(空格鍵)翻頁,Enter(回車鍵)向下滾動(dòng)一行,或者使用j,k(vim編輯器的移動(dòng)鍵)進(jìn)行向前向后滾動(dòng)一行。按下h鍵為顯示使用幫助(因?yàn)閙an使用less作為閱讀器,實(shí)為less工具的幫助),按下q退出。

想要獲得更詳細(xì)的幫助,你還可以使用info命令,不過通常使用man就足夠了。如果你知道某個(gè)命令的作用,只是想快速查看一些它的某個(gè)具體參數(shù)的作用,那么你可以使用--help參數(shù),大部分命令都會(huì)帶有這個(gè)參數(shù),如:

ls --help

  6.輸入的who am i表示打開當(dāng)前偽終端的用戶的用戶名(要查看當(dāng)前登錄用戶的用戶名,去掉空格直接使用?whoami?即可)

  7.who 命令其它常用參數(shù)

      參數(shù)???????? 說明

      -a????? 打印能打印的全部

      -d????? 打印死掉的進(jìn)程

      -m??? 同am i,mom likes

      -q????? 打印當(dāng)前登錄用戶數(shù)及用戶名

      -u????? 打印當(dāng)前登錄用戶登錄信息

      -r????? 打印運(yùn)行等級

  8.在 Linux 系統(tǒng)里,?root?賬戶擁有整個(gè)系統(tǒng)至高無上的權(quán)利,比如 新建/添加 用戶。要?jiǎng)?chuàng)建用戶需要 root 權(quán)限,這里就要用到?sudo?這個(gè)命令了。不過使用這個(gè)命令有兩個(gè)大前提,一是你要知道當(dāng)前登錄用戶的密碼,二是當(dāng)前用戶必須在?sudo?用戶組。

?  創(chuàng)建新用戶lilei,退出當(dāng)前用戶跟退出終端一樣可以使用?exit?命令或者使用快捷鍵?Ctrl+d。

  登陸新用戶lilei

  退出當(dāng)前用戶lilei

  9.

在 Linux 里面知道自己屬于哪些用戶組的方法

?

方法一:使用groups命令

$ groups shiyanlou

?其中冒號之前表示用戶,后面表示該用戶所屬的用戶組。這里可以看到 shiyanlou 用戶同時(shí)屬于 shiyanlou用戶組,每次新建用戶如果不指定用戶組的話,默認(rèn)會(huì)自動(dòng)創(chuàng)建一個(gè)與用戶名相同的用戶組(差不多就相當(dāng)于家長的意思,或者說是老總)。默認(rèn)情況下在sudo用戶組里的可以使用sudo命令獲得root權(quán)限。

?

方法二:查看/etc/group文件

$ cat /etc/group | sort

?提示 lilei 不在 sudoers 文件中,意思就是 lilei 不在 sudo 用戶組中

  使用 usermod 命令可以為用戶添加用戶組,同樣使用該命令你必需有 root 權(quán)限,你可以直接使用 root 用戶為其它用戶添加用戶組,或者用其它已經(jīng)在 sudo 用戶組的用戶使用 sudo 命令獲取權(quán)限來執(zhí)行該命令

這里我用 shiyanlou 用戶執(zhí)行 sudo 命令將 lilei 添加到 sudo 用戶組,讓它也可以使用 sudo 命令獲得 root 權(quán)限

$ su shiyanlou

$ groups lilei

$ sudo usermod -G sudo lilei

$ groups lilei

然后你再切換會(huì) lilei 用戶,現(xiàn)在就可以使用 sudo 獲取 root 權(quán)限了。

  刪除用戶:

  10.查看文件權(quán)限

?文件類型

關(guān)于文件類型,這里有一點(diǎn)你必需時(shí)刻牢記Linux?里面一切皆文件,正因?yàn)檫@一點(diǎn)才有了設(shè)備文件(?/dev?目錄下有各種設(shè)備文件,大都跟具體的硬件設(shè)備相關(guān))這一說,還有?socket(網(wǎng)絡(luò)套接字,具體是什么,感興趣的用戶可以自己去了解或期待實(shí)驗(yàn)樓的后續(xù)相關(guān)課程),和?pipe (管道,這個(gè)東西很重要,我們以后將會(huì)討論到,這里你先知道有它的存在即可)。軟鏈接文件,鏈接文件是分為兩種的,另一種當(dāng)然是“硬鏈接”(硬鏈接不常用,具體內(nèi)容不作為本課程討論重點(diǎn),而軟鏈接等同于?Windows?上的快捷方式,你記住這一點(diǎn)就夠了)

?文件權(quán)限

讀權(quán)限,表示你可以使用?cat <file name>?之類的命令來讀取某個(gè)文件的內(nèi)容;寫權(quán)限,表示你可以編輯和修改某個(gè)文件;?執(zhí)行權(quán)限,通常指可以運(yùn)行的二進(jìn)制程序文件或者腳本文件,如同?Windows?上的?'exe'?后綴的文件,不過?Linux?上不是通過文件后綴名來區(qū)分文件的類型。你需要注意的一點(diǎn)是,一個(gè)目錄要同時(shí)具有讀權(quán)限和執(zhí)行權(quán)限才可以打開,而一個(gè)目錄要有寫權(quán)限才允許在其中創(chuàng)建其它文件,這是因?yàn)槟夸浳募?shí)際保存著該目錄里面的文件的列表等信息

所有者權(quán)限,這一點(diǎn)相信你應(yīng)該明白了,至于所屬用戶組權(quán)限,是指你所在的用戶組中的所有其它用戶對于該文件的權(quán)限,比如,你有一個(gè)艾派德,那么這個(gè)用戶組權(quán)限就決定了你的兄弟姐妹有沒有權(quán)限使用它破壞它和占有它。

?鏈接數(shù)

鏈接到該文件所在的?inode?結(jié)點(diǎn)的文件名數(shù)目(關(guān)于這個(gè)概念涉及到?Linux?文件系統(tǒng)的相關(guān)概念知識,不在本課程的討論范圍,感興趣的用戶可以自己去了解)。

?文件大小

?inode?結(jié)點(diǎn)大小為單位來表示的文件大小,你可以給?ls?加上?-lh?參數(shù)來更直觀的查看文件的大小。

  ls的其他命令

?

    顯示除了 '.'(當(dāng)前目錄),'..' 上一級目錄之外的所有包含隱藏文件(Linux 下以 '.' 開頭的文件為隱藏文件)

      $ ls -A

    查看某一個(gè)目錄的完整屬性,而不是顯示目錄里面的文件屬性:

      $ ls -Al

    顯示所有文件大小,并以普通人類能看懂的方式呈現(xiàn):

      $ ls -dl <目錄名>

    其中小 s 為顯示文件大小,大 S 為按文件大小排序,若需要知道如何按其它方式排序,請使用“man”命令查詢。

      $ ls -AsSh

?  11.變更文件所有者

文件music的所有者是用戶lilei,將其擁有者修改為shiyanlou

12.修改文件權(quán)限

?方式一:二進(jìn)制數(shù)字表示

?

?

?

每個(gè)文件的三組權(quán)限(擁有者,所屬用戶組,其他用戶,記住這個(gè)順序是一定的)就對應(yīng)這一個(gè) "rwx",也就是一個(gè) '7' 。

?方式二:加減賦值操作

?

13.

FHS 定義了兩層規(guī)范,第一層是, / 下面的各個(gè)目錄應(yīng)該要放什么文件數(shù)據(jù),例如 /etc 應(yīng)該要放置設(shè)置文件,/bin 與 /sbin 則應(yīng)該要放置可執(zhí)行文件等等。

?第二層則是針對 /usr 及 /var 這兩個(gè)目錄的子目錄來定義。例如 /var/log 放置系統(tǒng)登錄文件、/usr/share 放置共享數(shù)據(jù)等等。

?

使用 cd 命令可以切換目錄,在 Linux 里面使用 . 表示當(dāng)前目錄,.. 表示上一級目錄(**注意,還記得我們上一節(jié)介紹過的,以 . 開頭的文件都是隱藏文件,所以這兩個(gè)目錄必然也是隱藏的,你可以使用 ls -a 命令查看隱藏文件), - 表示上一次所在目錄,~ 通常表示當(dāng)前用戶的"home"目錄。使用 pwd 命令可以獲取當(dāng)前所在路徑(絕對路徑)。

進(jìn)入上一級目錄:

$ cd ..

?

?

進(jìn)入你的“home”目錄:

$ cd ~

# 或者 cd /home/<你的用戶名>

?

?

使用 pwd 獲取當(dāng)前路徑:

$ pwd

絕對路徑

?關(guān)于絕對路徑,簡單地說就是以根"/"目錄為起點(diǎn)的完整路徑,以你所要到的目錄為終點(diǎn),表現(xiàn)形式如: /usr/local/bin,表示根目錄下的 usr 目錄中的 local 目錄中的 bin 目錄。

?

相對路徑

?

相對路徑,也就是相對于你當(dāng)前的目錄的路徑,相對路徑是以當(dāng)前目錄 . 為起點(diǎn),以你所要到的目錄為終點(diǎn),表現(xiàn)形式如: usr/local/bin (這里假設(shè)你當(dāng)前目錄為根目錄)。

提示:在進(jìn)行目錄切換的過程中請多使用 Tab 鍵自動(dòng)補(bǔ)全,可避免輸入錯(cuò)誤,連續(xù)按兩次Tab可以顯示全部候選結(jié)果

1.新建

?新建空白文件

?使用 touch 命令創(chuàng)建空白文件,創(chuàng)建名為 test 的空白文件,因?yàn)樵谄渌夸洓]有權(quán)限,所以需要先 cd ~ 切換回用戶的 /home/shiyanlou 目錄:

$ cd ~

$ touch test

?

新建目錄

?使用 mkdir(make directories)命令可以創(chuàng)建一個(gè)空目錄,也可同時(shí)指定創(chuàng)建目錄的權(quán)限屬性

?

創(chuàng)建名為"mydir"的空目錄:

$ mkdir mydir

?

?使用 -p 參數(shù),同時(shí)創(chuàng)建父目錄(如果不存在該父目錄),如下我們同時(shí)創(chuàng)建一個(gè)多級目錄(這在有時(shí)候安裝軟件,配置安裝路徑時(shí)非常有用):

$ mkdir -p father/son/grandson

2.復(fù)制

?

復(fù)制文件

?

使用cp(copy)命令復(fù)制一個(gè)文件或目錄到指定目錄。將之前創(chuàng)建的"test"文件復(fù)制到"/home/shiyanlou/father/son/grandson"目錄中:

$ cp test father/son/grandson

復(fù)制目錄

?

要成功復(fù)制目錄需要加上-r或者-R參數(shù),表示遞歸復(fù)制,就是說有點(diǎn)“株連九族”的意思:

$ cp -r father family

3.刪除

?

刪除文件

?

使用rm(remove files or directories)命令,刪除一個(gè)文件或目錄:

$ rm test

你如果想忽略這提示,直接刪除文件,可以使用-f參數(shù)強(qiáng)制刪除:

$ rm -f test

刪除目錄

?

跟復(fù)制目錄一樣,要?jiǎng)h除一個(gè)目錄,也需要加上-r或-R參數(shù):

$ rm -r family

4.移動(dòng)文件與文件重命名

?

移動(dòng)文件

?

使用mv(move or rename files)命令,移動(dòng)文件(剪切)。將文件"file1"移動(dòng)到"Documents"目錄mv 源目錄文件 目的目錄:

$ mv file1 Documents

重命名文件

?

將文件"file1"重命名為"myfile" mv 舊的文件名 新的文件名:

$ mv file1 myfile

5.查看文件

?

使用cat,tac和nl命令查看文件

?

這兩個(gè)命令都是用來打印文件內(nèi)容到標(biāo)準(zhǔn)輸出(終端),其中cat為正序顯示,tac倒序顯示。

nl命令,添加行號并打印,這是個(gè)比cat -n更專業(yè)的行號打印命令。

?

這里簡單列舉它的常用的幾個(gè)參數(shù):

-b : 指定添加行號的方式,主要有兩種:

??? -b a:表示無論是否為空行,同樣列出行號("cat -n"就是這種方式)

??? -b t:只列出非空行的編號并列出(默認(rèn)為這種方式)

-n : 設(shè)置行號的樣式,主要有三種:

??? -n ln:在行號字段最左端顯示

??? -n rn:在行號字段最右邊顯示,且不加 0

??? -n rz:在行號字段最右邊顯示,且加 0

-w : 行號字段占用的位數(shù)(默認(rèn)為 6 位)

使用more工具打開passwd文件:

$ more passwd

這里想到系統(tǒng)新增加一個(gè)用戶,應(yīng)該會(huì)將用戶的信息添加到passwd文件的最后,那么這時(shí)候我們就可以使用tail命令了:

$ tail /etc/passwd

?

?

甚至更直接的只看一行, 加上-n參數(shù),后面緊跟行數(shù):

$ tail -n 1 /etc/passwd

6.查看文件類型

?

前面我提到過,在 Linux 下面文件的類型不是根據(jù)文件后綴來判斷的,我們通常使用file命令可以查看文件的類型:

$ file /bin/ls

7.編輯文件

$ vimtutor

  15.

一、環(huán)境變量

?1.變量

變量的作用域即變量的有效范圍(比如一個(gè)函數(shù)中、一個(gè)源文件中或者全局范圍),在該范圍內(nèi)只能有一個(gè)同名變量。一旦離開則該變量無效,如同不存在這個(gè)變量一般。

使用=號賦值運(yùn)算符為變量 tmp 賦值為 shiyanlou:

$ tmp=shiyanlou

讀取變量的值,使用echo命令和$符號($符號用于表示引用一個(gè)變量的值,初學(xué)者經(jīng)常會(huì)忘記輸入):

$ echo $tmp

2.環(huán)境變量

簡單理解了變量的概念,就很好解釋環(huán)境變量了,環(huán)境變量就是作用域比自定義變量要大,如Shell 的環(huán)境變量作用于自身和它的子進(jìn)程。

通常我們會(huì)涉及到的環(huán)境變量有三種:

?當(dāng)前 Shell 進(jìn)程私有用戶自定義變量,如上面我們創(chuàng)建的 temp 變量,只在當(dāng)前 Shell 中有效。

?Shell 本身內(nèi)建的變量。

?從自定義變量導(dǎo)出的環(huán)境變量。

?

也有三個(gè)與上述三種環(huán)境變量相關(guān)的命令,set,env,export。

?

命令  說明

set     顯示當(dāng)前 Shell 所有環(huán)境變量,包括其內(nèi)建環(huán)境變量(與 Shell 外觀等相關(guān)),用戶自定義變量及導(dǎo)出的環(huán)境變量

env    ? 顯示與當(dāng)前用戶相關(guān)的環(huán)境變量,還可以讓命令在指定環(huán)境中運(yùn)行

export   顯示從 Shell 中導(dǎo)出成環(huán)境變量的變量,也能通過它將自定義變量導(dǎo)出為環(huán)境變量

3.命令的查找路徑與順序

我們在 Shell 中輸入一個(gè)命令,Shell 是怎么知道在哪去找到這個(gè)命令然后執(zhí)行的呢?這是通過環(huán)境變量PATH來進(jìn)行搜索的,這個(gè)PATH里面就保存了Shell中執(zhí)行的命令的搜索路徑。

?查看PATH環(huán)境變量的內(nèi)容:

$ echo $PATH

通常這一類目錄下放的都是可執(zhí)行文件,當(dāng)我們在 Shell 中執(zhí)行一個(gè)命令時(shí),系統(tǒng)就會(huì)按照 PATH 中設(shè)定的路徑按照順序依次到目錄中去查找,如果存在同名的命令,則執(zhí)行先找到的那個(gè)。

創(chuàng)建一個(gè) Shell 腳本文件:

$ vim hello_shell.sh

在腳本中添加如下內(nèi)容,保存并退出(注意不要省掉第一行,這不是注釋,論壇有用戶反應(yīng)會(huì)有語法錯(cuò)誤,就是因?yàn)闆]有了第一行):

#!/bin/zsh

for ((i=0; i<10; i++));do

??? echo "hello shell"

done

exit 0

文件添加可執(zhí)行權(quán)限:

$ chmod 755 hello_shell.sh

執(zhí)行腳本

$ ./hello_shell.sh

創(chuàng)建一個(gè) C 語言"hello world"程序:

$ vim hello_world.c

#include <stdio.h>

int main(void)

{

??? printf("hello world!\n");

??? return 0;

}

使用 gcc 生成可執(zhí)行文件:

$ gcc -o hello_world hello_world.c

gcc 生成二進(jìn)制文件默認(rèn)具有可執(zhí)行權(quán)限,不需要修改

在 shiyanlou 家目錄創(chuàng)建一個(gè)mybin目錄,并將上述 hello_shell.sh 和 hello_world 文件移動(dòng)到其中:

$ mkdir mybin

$ mv hello_shell.sh hello_world mybin/

現(xiàn)在你可以在mybin目錄中分別運(yùn)行你剛剛創(chuàng)建的兩個(gè)程序:

$ cd mybin

$ ./hello_shell.sh

$ ./hello_world

?4.添加自定義路徑到“PATH”環(huán)境變量

在前面我們應(yīng)該注意到PATH里面的路徑是以:作為分割符,所以我們可以這樣添加自定義路徑:

$ PATH=$PATH:/home/shiyanlou/mybin

注意這里一定要使用絕對路徑

$ echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc

?

?

上述命令中>>表示將標(biāo)準(zhǔn)輸出以追加的方式重定向到一個(gè)文件中,注意前面用到的>是以覆蓋的方式重定向到一個(gè)文件中,使用的時(shí)候一定要注意分辨。在指定文件不存在的情況下都會(huì)創(chuàng)建新的文件。

5.修改和刪除已有變量

?

變量修改

變量的修改有以下幾種方式:

變量設(shè)置方式???????? 說明

${變量名#匹配字串} ??? 從頭向后開始匹配,刪除符合匹配字串的最短數(shù)據(jù)

${變量名##匹配字串} ? 從頭向后開始匹配,刪除符合匹配字串的最長數(shù)據(jù)

${變量名%匹配字串} ?? 從尾向前開始匹配,刪除符合匹配字串的最短數(shù)據(jù)

${變量名%%匹配字串} 從尾向前開始匹配,刪除符合匹配字串的最長數(shù)據(jù)

${變量名/舊的字串/新的字串}? 將符合舊字串的第一個(gè)字串替換為新的字串

${變量名//舊的字串/新的字串} 將符合舊字串的全部字串替換為新的字串

?

變量刪除

可以使用unset命令刪除一個(gè)環(huán)境變量:

$ unset temp

?

6.如何讓環(huán)境變量立即生效

在上面我們在 Shell 中修改了一個(gè)配置腳本文件之后(比如 zsh 的配置文件 home 目錄下的.zshrc),每次都要退出終端重新打開甚至重啟主機(jī)之后其才能生效,很是麻煩,我們可以使用source命令來讓其立即生效,如:

$ source .zshrc

$ . ./.zshrc

注意第一個(gè)點(diǎn)后面有一個(gè)空格,而且后面的文件必須指定完整的絕對或相對路徑名,source 則不需要。

  16.搜索文件

與搜索相關(guān)的命令常用的有如下幾個(gè)whereis,which,find,locate。

?

?whereis簡單快速

$whereis who

如果想要獲得更全面的搜索結(jié)果可以使用locate命令。(注意,它不只是在 etc 目錄下查找并會(huì)自動(dòng)遞歸子目錄進(jìn)行查找)

?locate快而全

?查找 /usr/share/ 下所有 jpg 文件:

$ locate /usr/share/\*.jpg

注意要添加*號前面的反斜杠轉(zhuǎn)義,否則會(huì)無法找到

如果想只統(tǒng)計(jì)數(shù)目可以加上-c參數(shù),-i參數(shù)可以忽略大小寫進(jìn)行查找,whereis 的-b,-m,-s同樣可以是使用。

?which小而精

which本身是 Shell 內(nèi)建的一個(gè)命令,我們通常使用which來確定是否安裝了某個(gè)指定的軟件,因?yàn)樗粡腜ATH環(huán)境變量指定的路徑中去搜索命令:

$ which man

??find精而細(xì)

find應(yīng)該是這幾個(gè)命令中最強(qiáng)大的了,它不但可以通過文件類型、文件名進(jìn)行查找而且可以根據(jù)文件的屬性(如文件的時(shí)間戳,文件的權(quán)限等)進(jìn)行搜索。find命令強(qiáng)大到,要把它將明白至少需要單獨(dú)好幾節(jié)課程才行,我們這里只介紹一些常用的內(nèi)容。

在指定目錄下搜索指定文件名的文件:

$ find /etc/ -name interfaces

?注意 find 命令的路徑是作為第一個(gè)參數(shù)的, 基本命令格式為 find [path] [option] [action]

與時(shí)間相關(guān)的命令參數(shù):

?

參數(shù)???????? 說明

?

-atime 最后訪問時(shí)間?

?

-ctime 創(chuàng)建時(shí)間

?

-mtime 最后修改時(shí)間

?

?

?

下面以-mtime參數(shù)舉例:

?

?-mtime n: n 為數(shù)字,表示為在n天之前的”一天之內(nèi)“修改過的文件

?

?-mtime +n: 列出在n天之前(不包含n天本身)被修改過的文件

?

?-mtime -n: 列出在n天之前(包含n天本身)被修改過的文件

?

?newer file: file為一個(gè)已存在的文件,列出比file還要新的文件名

?

列出 home 目錄中,當(dāng)天(24 小時(shí)之內(nèi))有改動(dòng)的文件:

?

$ find ~ -mtime 0

?

列出用戶家目錄下比Code文件夾新的文件:

$ find ~ -newer /home/shiyanlou/Code

17.文件打包和解壓縮

在講 Linux 上的解壓縮工具之前,有必要先了解以下常見常用的壓縮包文件格式。在 Windows 上我們最常見的不外乎這三種*.zip,*.rar,*.7z后綴的壓縮文件,而在 Linux 上面常見常用的除了以上這三種外,還有*.gz,*.xz,*.bz2,*.tar,*.tar.gz,*.tar.xz,*tar.bz2,簡單介紹如下:

文件后綴名???? 說明

*.zip zip???????????? 程序打包壓縮的文件

*.rar rar??????????? 程序壓縮的文件

*.7z 7zip?????????? 程序壓縮的文件

*.tar tar??????????? 程序打包,未壓縮的文件

*.gz gzip?????????? 程序(GNU zip)壓縮的文件

*.xz xz?????????????? 程序壓縮的文件

*.bz2 bzip2?????? 程序壓縮的文件

*.tar.gz tar?????? 打包,gzip程序壓縮的文件

*.tar.xz tar?????? 打包,xz程序壓縮的文件

*tar.bz2 tar????? 打包,bzip2程序壓縮的文件

*.tar.7z tar?????? 打包,7z程序壓縮的文件

講了這么多種壓縮文件,這么多個(gè)命令,不過我們一般只需要掌握幾個(gè)命令即可,包括zip,rar,tar。

1.zip壓縮打包程序

?使用zip打包文件夾:

?設(shè)置壓縮級別為9和1(9最大,1最小),重新打包:

$ zip -r -9 -q -o shiyanlou_9.zip /home/shiyanlou -x ~/*.zip

$ zip -r -1 -q -o shiyanlou_1.zip /home/shiyanlou -x ~/*.zip

這里添加了一個(gè)參數(shù)用于設(shè)置壓縮級別-[1-9],1表示最快壓縮但體積大,9表示體積最小但耗時(shí)最久。最后那個(gè)-x是為了排除我們上一次創(chuàng)建的 zip 文件,否則又會(huì)被打包進(jìn)這一次的壓縮文件中,注意:這里只能使用絕對路徑,否則不起作用。

我們再用du命令分別查看默認(rèn)壓縮級別、最低、最高壓縮級別及未壓縮的文件的大小:

$ du -h -d 0 *.zip ~ | sort

通過man 手冊可知:

?h, --human-readable(顧名思義,你可以試試不加的情況)

?d, --max-depth(所查看文件的深度)

?創(chuàng)建加密zip包

?

使用-e參數(shù)可以創(chuàng)建加密壓縮包:

$ zip -r -e -o shiyanlou_encryption.zip /home/shiyanlou

?

?

注意: 關(guān)于zip命令,因?yàn)?Windows 系統(tǒng)與 Linux/Unix 在文本文件格式上的一些兼容問題,比如換行符(為不可見字符),在 Windows 為 CR+LF(Carriage-Return+Line-Feed:回車加換行),而在 Linux/Unix 上為 LF(換行),所以如果在不加處理的情況下,在 Linux 上編輯的文本,在 Windows 系統(tǒng)上打開可能看起來是沒有換行的。如果你想讓你在 Linux 創(chuàng)建的 zip 壓縮文件在 Windows 上解壓后沒有任何問題,那么你還需要對命令做一些修改:

$ zip -r -l -o shiyanlou.zip /home/shiyanlou

18.使用unzip命令解壓縮zip文件

將shiyanlou.zip解壓到當(dāng)前目錄:

$ unzip shiyanlou.zip

?使用安靜模式,將文件解壓到指定目錄:

$ unzip -q shiyanlou.zip -d ziptest

如果你不想解壓只想查看壓縮包的內(nèi)容你可以使用-l參數(shù):

$ unzip -l shiyanlou.zip

?

?

注意: 使用unzip解壓文件時(shí)我們同樣應(yīng)該注意兼容問題,不過這里我們關(guān)心的不再是上面的問題,而是中文編碼的問題,通常 Windows 系統(tǒng)上面創(chuàng)建的壓縮文件,如果有有包含中文的文檔或以中文作為文件名的文件時(shí)默認(rèn)會(huì)采用 GBK 或其它編碼,而 Linux 上面默認(rèn)使用的是 UTF-8 編碼,如果不加任何處理,直接解壓的話可能會(huì)出現(xiàn)中文亂碼的問題(有時(shí)候它會(huì)自動(dòng)幫你處理),為了解決這個(gè)問題,我們可以在解壓時(shí)指定編碼類型。

?

使用-O(英文字母,大寫o)參數(shù)指定編碼類型:

unzip -O GBK 中文壓縮文件.zip

3.rar打包壓縮命令

?

rar也是 Windows 上常用的一種壓縮文件格式,在 Linux 上可以使用rar和unrar工具分別創(chuàng)建和解壓 rar 壓縮包。

?安裝rar和unrar工具:

$ sudo apt-get update

$ sudo apt-get install rar unrar

?

?從指定文件或目錄創(chuàng)建壓縮包或添加文件到壓縮包:

$ rm *.zip

$ rar a shiyanlou.rar .

?

?

上面的命令使用a參數(shù)添加一個(gè)目錄~到一個(gè)歸檔文件中,如果該文件不存在就會(huì)自動(dòng)創(chuàng)建。

?

注意:rar 的命令參數(shù)沒有-,如果加上會(huì)報(bào)錯(cuò)。

?從指定壓縮包文件中刪除某個(gè)文件:

$ rar d shiyanlou.rar .zshrc

?

?查看不解壓文件:

$ rar l shiyanlou.rar

?

?使用unrar解壓rar文件

?

全路徑解壓:

$ unrar x shiyanlou.rar

?

?

去掉路徑解壓:

$ mkdir tmp

$ unrar e shiyanlou.rar tmp/

?

?

4.tar打包工具

tar 的解壓和壓縮都是同一個(gè)命令,只需參數(shù)不同,使用比較方便。

?

下面先掌握tar命令一些基本的使用方式,即不進(jìn)行壓縮只是進(jìn)行打包(創(chuàng)建歸檔文件)和解包的操作。

?創(chuàng)建一個(gè) tar 包:

$ tar -cf shiyanlou.tar ~

?解包一個(gè)文件(-x參數(shù))到指定路徑的已存在目錄(-C參數(shù)):

$ mkdir tardir

$ tar -xf shiyanlou.tar -C tardir

?

?只查看不解包文件-t參數(shù):

$ tar -tf shiyanlou.tar

?

?保留文件屬性和跟隨鏈接(符號鏈接或軟鏈接),有時(shí)候我們使用tar備份文件當(dāng)你在其他主機(jī)還原時(shí)希望保留文件的屬性(-p參數(shù))和備份鏈接指向的源文件而不是鏈接本身(-h參數(shù)):

$ tar -cphf etc.tar /etc

?

?

對于創(chuàng)建不同的壓縮格式的文件,對于tar來說是相當(dāng)簡單的,需要的只是換一個(gè)參數(shù),這里我們就以使用gzip工具創(chuàng)建*.tar.gz文件為例來說明。

?我們只需要在創(chuàng)建 tar 文件的基礎(chǔ)上添加-z參數(shù),使用gzip來壓縮文件:

$ tar -czf shiyanlou.tar.gz ~

?

?解壓*.tar.gz文件:

$ tar -xzf shiyanlou.tar.gz

現(xiàn)在我們要使用其他的壓縮工具創(chuàng)建或解壓相應(yīng)文件只需要更改一個(gè)參數(shù)即可:

壓縮文件格式???????? 參數(shù)

*.tar.gz ??????????????????? -z

*.tar.xz ???????????????????? -J

*tar.bz2????????????????????? -j

19.簡單文件系統(tǒng)操作

1.查看磁盤和目錄的容量

使用 df 命令查看磁盤的容量

$ df

$ df -h

現(xiàn)在你就可以使用命令查看你主機(jī)磁盤的使用情況了。至于掛載點(diǎn)如果你還記得前面第 4 節(jié)介紹 Linux 目錄樹結(jié)構(gòu)的內(nèi)容,那么你就應(yīng)該能很好的理解掛載的概念,這里就不再贅述。

?使用 du 命令查看目錄的容量,這個(gè)命令前面其實(shí)已經(jīng)用了很多次了:

# 默認(rèn)同樣以 blocks 的大小展示

$ du

# 加上`-h`參數(shù),以更易讀的方式展示

$ du -h

?

-d參數(shù)指定查看目錄的深度

# 只查看1級目錄的信息

$ du -h -d 0 ~

# 查看2級

$ du -h -d 1 ~

du(estimate file space usage)命令與df(report file system disk space usage)只用一字只差,首先就希望注意不要弄混淆了,以可以像我這樣從man手冊中獲取命令的完整描述,記全稱就不會(huì)搞混了。

二、簡單的磁盤管理

下面涉及的命令具有一定的危險(xiǎn)性,操作不當(dāng)可能會(huì)丟失你的個(gè)人數(shù)據(jù),初學(xué)者建議在虛擬環(huán)境中進(jìn)行操作

?

  • 創(chuàng)建虛擬磁盤
  • 的命令行語句與其他的 Linux 程序不同,因?yàn)樗拿钚羞x項(xiàng)格式為選項(xiàng)=值,而不是更標(biāo)準(zhǔn)的--選項(xiàng) 值或-選項(xiàng)=值。dd默認(rèn)從標(biāo)準(zhǔn)輸入中讀取,并寫入到標(biāo)準(zhǔn)輸出中,但可以用選項(xiàng)if(input file,輸入文件)和of(output file,輸出文件)改變。

    我們先來試試用dd命令從標(biāo)準(zhǔn)輸入讀入用戶輸入到標(biāo)準(zhǔn)輸出或者一個(gè)文件:

    # 輸出到文件

    $ dd of=test bs=10 count=1 # 或者 dd if=/dev/stdin of=test bs=10 count=1

    # 輸出到標(biāo)準(zhǔn)輸出

    $ dd if=/dev/stdin of=/dev/stdout bs=10 count=1

    將輸出的英文字符轉(zhuǎn)換為大寫再寫入文件:

    $ dd if=/dev/stdin of=test bs=10 count=1 conv=ucase

    使用 dd 命令創(chuàng)建虛擬鏡像文件

    通過上面一小節(jié),你應(yīng)該掌握了dd的基本使用,下面就來使用dd命令來完成創(chuàng)建虛擬磁盤的第一步。

    從/dev/zero設(shè)備創(chuàng)建一個(gè)容量為 256M 的空文件:

    $ dd if=/dev/zero of=virtual.img bs=1M count=256

    $ du -h virtual.img

    ?

    使用 mkfs 命令格式化磁盤(我們這里是自己創(chuàng)建的虛擬磁盤鏡像)

    你可以在命令行輸入 mkfs 然后按下Tab鍵,你可以看到很多個(gè)以 mkfs 為前綴的命令,這些不同的后綴其實(shí)就是表示著不同的文件系統(tǒng),可以用 mkfs 格式化成的文件系統(tǒng):

    我們可以簡單的使用下面的命令來將我們的虛擬磁盤鏡像格式化為ext4文件系統(tǒng):

    $ mkfs.ext4 virtual.img

    ?

    ?

    使用 mount 命令掛載磁盤到目錄樹

    ?

    我們先來使用mount來查看下主機(jī)已經(jīng)掛載的文件系統(tǒng):

    $ sudo mount

    那么我們?nèi)绾螔燧d真正的磁盤到目錄樹呢,mount命令的一般格式如下:

    mount [options] [source] [directory]

    ?

    ?一些常用操作:

    ?

    mount [-o [操作選項(xiàng)]] [-t 文件系統(tǒng)類型] [-w|--rw|--ro] [文件系統(tǒng)源] [掛載點(diǎn)]

    我們現(xiàn)在直接來掛載我們創(chuàng)建的虛擬磁盤鏡像到/mnt目錄:

    $ mount -o loop -t ext4 virtual.img /mnt

    # 也可以省略掛載類型,很多時(shí)候 mount 會(huì)自動(dòng)識別

    # 以只讀方式掛載

    $ mount -o loop --ro virtual.img /mnt

    # 或者mount -o loop,ro virtual.img /mnt

    ?

    使用 umount 命令卸載已掛載磁盤

    # 命令格式 sudo umount 已掛載設(shè)備名或者掛載點(diǎn),如:

    $ sudo umount /mnt

    我們重點(diǎn)開一下中間的分區(qū)信息,/dev/sda1,/dev/sda2 為主分區(qū)分別安裝了 Windows 和 Linux 操作系統(tǒng),/dev/sda3 為交換分區(qū)(可以理解為虛擬內(nèi)存),/dev/sda4 為擴(kuò)展分區(qū)其中包含 /dev/sda5,/dev/sda6,/dev/sda7,/dev/sda8 四個(gè)邏輯分區(qū),因?yàn)橹鳈C(jī)上有幾個(gè)分區(qū)之間有空隙,沒有對齊邊界扇區(qū),所以分區(qū)之間的不是完全連續(xù)的。

    ?

    # 進(jìn)入磁盤分區(qū)模式

    $ sudo fdisk virtual.img

    使用 losetup 命令建立鏡像與回環(huán)設(shè)備的關(guān)聯(lián)

    $ sudo losetup /dev/loop0 virtual.img

    ?

    # 如果提示設(shè)備忙你也可以使用其它的回環(huán)設(shè)備,"ls /dev/loop*"參看所有回環(huán)設(shè)備# 解除設(shè)備關(guān)聯(lián)

    ?

    $ sudo losetup -d /dev/loop0

    然后再使用mkfs格式化各分區(qū)(前面我們是格式化整個(gè)虛擬磁盤鏡像文件或磁盤),不過格式化之前,我們還要為各分區(qū)建立虛擬設(shè)備的映射,用到kpartx工具,需要先安裝:

    $ sudo apt-get install kpartx

    $ sudo kpart kpartx -av /dev/loop0

    # 取消映射

    $ sudo kpart kpartx -dv /dev/loop0接著再是格式化,我們將其全部格式化為 ext4:

    ?

    $ sudo mkfs.ext4 -q /dev/mapper/loop0p1

    ?

    $ sudo mkfs.ext4 -q /dev/mapper/loop0p5

    ?

    $ sudo mkfs.ext4 -q /dev/mapper/loop0p6

    ?

    ?格式化完成后在/media目錄下新建四個(gè)空目錄用于掛載虛擬磁盤:

    ?

    $ mkdir -p /media/virtualdisk_{1..3}

    # 掛載磁盤分區(qū)

    $ sudo mount /dev/mapper/loop0p1 /media/virtualdisk_1

    $ sudo mount /dev/mapper/loop0p5 /media/virtualdisk_2

    $ sudo mount /dev/mapper/loop0p6 /media/virtualdisk_3

    # 卸載磁盤分區(qū)

    $ sudo umount /dev/mapper/loop0p1

    $ sudo umount /dev/mapper/loop0p5

    $ sudo umount /dev/mapper/loop0p6

    然后:

    $ df -h

      20.一、命令執(zhí)行順序的控制

    順序執(zhí)行多條命令:簡單的順序執(zhí)行你可以使用;來完成

    有選擇的執(zhí)行命令:那么我們需要能夠有選擇性的來執(zhí)行命令,比如上一條命令執(zhí)行成功才繼續(xù)下一條,或者不成功又該做出其它什么處理,比如我們使用which來查找是否安裝某個(gè)命令,如果找到就執(zhí)行該命令,否則什么也不做(雖然這個(gè)操作沒有什么實(shí)際意義,但可幫你更好的理解一些概念):

    $ which cowsay>/dev/null && cowsay -f head-in ohch~

    你如果沒有安裝cowsay,你可以先執(zhí)行一次上述命令,你會(huì)發(fā)現(xiàn)什么也沒發(fā)生,你再安裝好之后你再執(zhí)行一次上述命令,你也會(huì)發(fā)現(xiàn)一些驚喜。上面的&&就是用來實(shí)現(xiàn)選擇性執(zhí)行的,它表示如果前面的命令執(zhí)行結(jié)果(不是表示終端輸出的內(nèi)容,而是表示命令執(zhí)行狀態(tài)的結(jié)果)返回0則執(zhí)行后面的,否則不執(zhí)行,你可以從$?環(huán)境變量獲取上一次命令的返回結(jié)果:

    ||在這里就是與&&相反的控制效果,當(dāng)上一條命令執(zhí)行結(jié)果為≠0($?≠0)時(shí)則執(zhí)行它后面的命令

    ?

      二、管道

    1.試用

    先試用一下管道,比如查看/etc目錄下有哪些文件和目錄,使用ls命令來查看:

    $ ls -al /etc

    有太多內(nèi)容,屏幕不能完全顯示,這時(shí)候可以使用滾動(dòng)條或快捷鍵滾動(dòng)窗口來查看。不過這時(shí)候可以使用管道:

    $ ls -al /etc | less

    ?

    通過管道將前一個(gè)命令(ls)的輸出作為下一個(gè)命令(less)的輸入,然后就可以一行一行地看。

    2.cut 命令,打印每一行的某一字段

    打印/etc/passwd文件中以:為分隔符的第1個(gè)字段和第6個(gè)字段分別表示用戶名和其家目錄:

    $ cut /etc/passwd -d ':' -f 1,6

    打印/etc/passwd文件中每一行的前N個(gè)字符:

    ?

    # 前五個(gè)(包含第五個(gè))

    $ cut /etc/passwd -c -5

    # 前五個(gè)之后的(包含第五個(gè))

    $ cut /etc/passwd -c 5-

    # 第五個(gè)

    $ cut /etc/passwd -c 5

    # 2到5之間的(包含第五個(gè))

    $ cut /etc/passwd -c 2-5

      3.grep 命令,在文本中或 stdin 中查找匹配字符串

    grep命令是很強(qiáng)大的,也是相當(dāng)常用的一個(gè)命令,它結(jié)合正則表達(dá)式可以實(shí)現(xiàn)很復(fù)雜卻很高效的匹配和查找,不過在學(xué)習(xí)正則表達(dá)式之前,這里介紹它簡單的使用,而關(guān)于正則表達(dá)式后面將會(huì)有單獨(dú)一小節(jié)介紹到時(shí)會(huì)再繼續(xù)學(xué)習(xí)grep命令和其他一些命令。

    grep命令的一般形式為:grep [命令選項(xiàng)]... 用于匹配的表達(dá)式 [文件]...

    還是先體驗(yàn)一下,我們搜索/home/shiyanlou目錄下所有包含"shiyanlou"的所有文本文件,并顯示出現(xiàn)在文本中的行號:

    $ grep -rnI "shiyanlou" ~

    -r 參數(shù)表示遞歸搜索子目錄中的文件,-n表示打印匹配項(xiàng)行號,-I表示忽略二進(jìn)制文件。這個(gè)操作實(shí)際沒有多大意義,但可以感受到grep命令的強(qiáng)大與實(shí)用。

    當(dāng)然也可以在匹配字段中使用正則表達(dá)式,下面簡單的演示:

    # 查看環(huán)境變量中以"yanlou"結(jié)尾的字符串

    $ export | grep ".*yanlou$"

    4. wc 命令,簡單小巧的計(jì)數(shù)工具

    wc 命令用于統(tǒng)計(jì)并輸出一個(gè)文件中行、單詞和字節(jié)的數(shù)目,比如輸出/etc/passwd文件的統(tǒng)計(jì)信息:

    $ wc /etc/passwd

    ?分別只輸出行數(shù)、單詞數(shù)、字節(jié)數(shù)、字符數(shù)和輸入文本中最長一行的字節(jié)數(shù):

    # 行數(shù)

    $ wc -l /etc/passwd

    # 單詞數(shù)

    $ wc -w /etc/passwd

    # 字節(jié)數(shù)

    $ wc -c /etc/passwd

    # 字符數(shù)

    $ wc -m /etc/passwd

    # 最長行字節(jié)數(shù)

    $ wc -L /etc/passwd

    注意:對于西文字符來說,一個(gè)字符就是一個(gè)字節(jié),但對于中文字符一個(gè)漢字是大于2個(gè)字節(jié)的,具體數(shù)目是由字符編碼決定的

    再來結(jié)合管道來操作一下,下面統(tǒng)計(jì) /etc 下面所有目錄數(shù):

    $ ls -dl /etc/*/ | wc -l

    5.sort 排序命令

    這個(gè)命令前面我們也是用過多次,功能很簡單就是將輸入按照一定方式排序,然后再輸出,它支持的排序有按字典排序,數(shù)字排序,按月份排序,隨機(jī)排序,反轉(zhuǎn)排序,指定特定字段進(jìn)行排序等等。

    默認(rèn)為字典排序:

    $ cat /etc/passswd | sort

    ?

    反轉(zhuǎn)排序:

    $ cat /etc/passwd | sort -r

    按特定字段排序:

    $ cat /etc/passwd | sort -t':' -k 3

    上面的-t參數(shù)用于指定字段的分隔符,這里是以":"作為分隔符;-k 字段號用于指定對哪一個(gè)字段進(jìn)行排序。這里/etc/passwd文件的第三個(gè)字段為數(shù)字,默認(rèn)情況下是一字典序排序的,如果要按照數(shù)字排序就要加上-n參數(shù):

    ?

    $ cat /etc/passwd | sort -t':' -k 3 -n

    6. uniq 去重命令

    uniq命令可以用于過濾或者輸出重復(fù)行。

    ?

    • ?過濾重復(fù)行可以使用history命令查看最近執(zhí)行過的命令(實(shí)際為讀取${SHELL}_history文件,如我們環(huán)境中的~/.zsh_history文件),不過你可能只想查看使用了那個(gè)命令而不需要知道具體干了什么,那么你可能就會(huì)要想去掉命令后面的參數(shù)然后去掉重復(fù)的命令:

    ?

    $ history | cut -c 8- | cut -d ' ' -f 1 | uniq

    不那么明顯,之所以不明顯是因?yàn)閡niq命令只能去連續(xù)重復(fù)的行,不是全文去重,所以要達(dá)到預(yù)期效果,我們先排序:

    ?

    $ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq

    # 或者$ history | cut -c 8- | cut -d ' ' -f 1 | sort -u

    ?

    • ?輸出重復(fù)行

    # 輸出重復(fù)過的行(重復(fù)的只輸出一個(gè))及重復(fù)次數(shù)

    $ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -dc

    # 輸出所有重復(fù)的行

    $ history | cut -c 8- | cut -d ' ' -f 1 | sort | uniq -D

    ?21.文本處理命令

    ?

    1.tr 命令

    ?

    tr 命令可以用來刪除一段文本信息中的某些文字。或者將其進(jìn)行轉(zhuǎn)換。

    使用方式:

    tr [option]...SET1 [SET2]

    常用的選項(xiàng)有:

    選項(xiàng)?? 說明

    -d 刪除和set1匹配的字符,注意不是全詞匹配也不是按字符順序匹配

    -s 去除set1指定的在輸入文本中連續(xù)并重復(fù)的字符

    操作舉例:

    # 刪除 "hello shiyanlou" 中所有的'o','l','h'

    $ echo 'hello shiyanlou' | tr -d 'olh'

    # 將"hello" 中的ll,去重為一個(gè)l

    $ echo 'hello' | tr -s 'l'

    # 將輸入文本,全部轉(zhuǎn)換為大寫或小寫輸出

    $ cat /etc/passwd | tr '[:lower:]' '[:upper:]'

    # 上面的'[:lower:]' '[:upper:]'你也可以簡單的寫作'[a-z]' '[A-Z]',當(dāng)然反過來將大寫變小寫也是可以的

    2.col 命令

    ?

    col 命令可以將Tab換成對等數(shù)量的空格建,或反轉(zhuǎn)這個(gè)操作。

    ?使用方式:

    col [option]

    常用的選項(xiàng)有:

    選項(xiàng)??????????? 說明

    -x 將Tab轉(zhuǎn)換為空格

    -h 將空格轉(zhuǎn)換為Tab(默認(rèn)選項(xiàng))

    ?

    操作舉例:

    # 查看 /etc/protocols 中的不可見字符,可以看到很多 ^I ,這其實(shí)就是 Tab 轉(zhuǎn)義成可見字符的符號

    $ cat -A /etc/protocols

    # 使用 col -x 將 /etc/protocols 中的 Tab 轉(zhuǎn)換為空格,然后再使用 cat 查看,你發(fā)現(xiàn) ^I 不見了

    $ cat /etc/protocols | col -x | cat -A

    3.join命令

    學(xué)過數(shù)據(jù)庫的用戶對這個(gè)應(yīng)該不會(huì)陌生,這個(gè)命令就是用于將兩個(gè)文件中包含相同內(nèi)容的那一行合并在一起。

    使用方式:

    join [option]... file1 file2

    常用的選項(xiàng)有:

    選項(xiàng)??????????? 說明

    -t 指定分隔符,默認(rèn)為空格

    -i 忽略大小寫的差異

    -1 指明第一個(gè)文件要用哪個(gè)字段來對比,,默認(rèn)對比第一個(gè)字段

    -2 指明第二個(gè)文件要用哪個(gè)字段來對比,,默認(rèn)對比第一個(gè)字段

    ?

    操作舉例:

    # 創(chuàng)建兩個(gè)文件

    $ echo '1 hello' > file1

    $ echo '1 shiyanlou' > file2

    $ join file1 file2

    # 將/etc/passwd與/etc/shadow兩個(gè)文件合并,指定以':'作為分隔符

    $ sudo join -t':' /etc/passwd /etc/shadow

    # 將/etc/passwd與/etc/group兩個(gè)文件合并,指定以':'作為分隔符, 分別比對第4和第3個(gè)字段

    $ sudo join -t':' -1 4 /etc/passwd -2 3 /etc/group

    4.paste命令

    paste這個(gè)命令與join 命令類似,它是在不對比數(shù)據(jù)的情況下,簡單地將多個(gè)文件合并一起,以Tab隔開。

    使用方式:

    paste [option] file...

    常用的選項(xiàng)有:

    選項(xiàng)?? 說明

    -d 指定合并的分隔符,默認(rèn)為Tab

    -s 不合并到一行,每個(gè)文件為一行

    ?

    操作舉例:

    $ echo hello > file1

    $ echo shiyanlou > file2

    $ echo www.shiyanlou.com > file3

    $ paste -d ':' file1 file2 file3

    $ paste -s file1 file2 file3

    ?

    ?

    23.簡單的重定向

    ?在更多了解 Linux 的重定向之前,我們需要先知道一些基本的東西,前面我們已經(jīng)提到過 Linux 默認(rèn)提供了三個(gè)特殊設(shè)備,用于終端的顯示和輸出,分別為stdin(標(biāo)準(zhǔn)輸入,對應(yīng)于你在終端的輸入),stdout(標(biāo)準(zhǔn)輸出,對應(yīng)于終端的輸出),stderr(標(biāo)準(zhǔn)錯(cuò)誤輸出,對應(yīng)于終端的輸出)。

    文件描述符

    ?

    設(shè)備文件  說明

    0 /dev/stdin 標(biāo)準(zhǔn)輸入

    1 /dev/stdout 標(biāo)準(zhǔn)輸出

    2 /dev/stderr 標(biāo)準(zhǔn)錯(cuò)誤

    我們可以這樣使用這些文件描述符:

    ?

    默認(rèn)使用終端的標(biāo)準(zhǔn)輸入作為命令的輸入和標(biāo)準(zhǔn)輸出作為命令的輸出

    $ cat

    (按Ctrl+C退出)

    ?

    ?

    將cat的連續(xù)輸出(heredoc方式)重定向到一個(gè)文件

    $ mkdir Documents

    $ cat > Documents/test.c\~ <<EOF

    #include <stdio.h>

    ?

    int main()

    {

    ??? printf("hello world\n");

    ??? return 0;

    }

    ?

    EOF

    ?

    ?

    將一個(gè)文件作為命令的輸入,標(biāo)準(zhǔn)輸出作為命令的輸出

    $ cat Documents/test.c\~

    ?

    ?

    將echo命令通過管道傳過來的數(shù)據(jù)作為cat命令的輸入,將標(biāo)準(zhǔn)輸出作為命令的輸出

    $ echo 'hi' | cat

    ?

    ?

    將echo命令的輸出從默認(rèn)的標(biāo)準(zhǔn)輸出重定向到一個(gè)普通文件

    $ echo 'hello shiyanlou' > redirect

    $ cat redirect

    .標(biāo)準(zhǔn)錯(cuò)誤重定向

    ?

    重定向標(biāo)準(zhǔn)輸出到文件,這是一個(gè)很實(shí)用的操作,另一個(gè)很實(shí)用的操作是將標(biāo)準(zhǔn)錯(cuò)誤重定向,標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤都被指向偽終端的屏幕顯示,所以我們經(jīng)常看到的一個(gè)命令的輸出通常是同時(shí)包含了標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤的結(jié)果的。比如下面的操作:

    # 使用cat 命令同時(shí)讀取兩個(gè)文件,其中一個(gè)存在,另一個(gè)不存在

    $ cat Documents/test.c\~ hello.c

    # 你可以看到除了正確輸出了前一個(gè)文件的內(nèi)容,還在末尾出現(xiàn)了一條錯(cuò)誤信息

    # 下面我們將輸出重定向到一個(gè)文件,根據(jù)我們前面的經(jīng)驗(yàn),這里將在看不到任何輸出了

    $ cat Documents/test.c\~ hello.c > somefile

    # 將標(biāo)準(zhǔn)錯(cuò)誤重定向到標(biāo)準(zhǔn)輸出,再將標(biāo)準(zhǔn)輸出重定向到文件,注意要將重定向到文件寫到前面

    $ cat Documents/test.c\~ hello.c >somefile? 2>&1

    # 或者只用bash提供的特殊的重定向符號"&"將標(biāo)準(zhǔn)錯(cuò)誤和標(biāo)準(zhǔn)輸出同時(shí)重定向到文件

    $ cat Documents/test.c\~ hello.c &>somefilehell

    ?

    ?

    注意你應(yīng)該在輸出重定向文件描述符前加上&,否則shell會(huì)當(dāng)做重定向到一個(gè)文件名為1的文件中

    3.使用tee命令同時(shí)重定向到多個(gè)文件

    ?

    經(jīng)常你可能還有這樣的需求,除了將需要將輸出重定向到文件之外也需要將信息打印在終端,那么你可以使用tee命令來實(shí)現(xiàn):

    $ echo 'hello shiyanlou' | tee hello

    4.永久重定向

    你應(yīng)該可以看出我們前面的重定向操作都只是臨時(shí)性的,即只對當(dāng)前命令有效,那如何做到“永久”有效呢,比如在一個(gè)腳本中,你需要某一部分的命令的輸出全部進(jìn)行重定向,難道要讓你在每個(gè)命令上面加上臨時(shí)重定向的操作嘛,當(dāng)然不需要,我們可以使用exec命令實(shí)現(xiàn)“永久”重定向。exec命令的作用是使用指定的命令替換當(dāng)前的 Shell,及使用一個(gè)進(jìn)程替換當(dāng)前進(jìn)程,或者指定新的重定向:

    # 先開啟一個(gè)子 Shell

    $ zsh

    # 使用exec替換當(dāng)前進(jìn)程的重定向,將標(biāo)準(zhǔn)輸出重定向到一個(gè)文件

    $ exec 1>somefile

    # 后面你執(zhí)行的命令的輸出都將被重定向到文件中,直到你退出當(dāng)前子shell,或取消exec的重定向(后面將告訴你怎么做)

    $ ls

    $ exit

    $ cat somefile

    5.創(chuàng)建輸出文件描述符

    默認(rèn)在 Shell 中可以有9個(gè)打開的文件描述符,上面我們使用了也是它默認(rèn)提供的0,1,2號文件描述符,另外我們還可以使用3-8的文件描述符,只是它們默認(rèn)沒有打開而已,你可以使用下面命令查看當(dāng)前 Shell 進(jìn)程中打開的文件描述符:

    $ cd /dev/fd/;ls -Al

    同樣使用exec命令可以創(chuàng)建新的文件描述符:

    $ zsh

    $ exec 3>somefile

    # 先進(jìn)入目錄,再查看,否則你可能不能得到正確的結(jié)果,然后再回到上一次的目錄

    $ cd /dev/fd/;ls -Al;cd -

    # 注意下面的命令>與&之間不應(yīng)該有空格,如果有空格則會(huì)出錯(cuò)

    $ echo "this is test" >&3

    $ cat somefile

    $ exit

    ?

    6.關(guān)閉文件描述符

    ?

    如上面我們打開的3號文件描述符,可以使用如下操作將它關(guān)閉:

    $ exec 3>&-

    $ cd /dev/fd;ls -Al;cd -

    ?

    ?

    7.完全屏蔽命令的輸出

    ?

    在 Linux 中有一個(gè)被成為“黑洞”的設(shè)備文件,所以導(dǎo)入它的數(shù)據(jù)都將被“吞噬”。

    ?

    ?

    在類 UNIX 系統(tǒng)中,/dev/null,或稱空設(shè)備,是一個(gè)特殊的設(shè)備文件,它通常被用于丟棄不需要的輸出流,或作為用于輸入流的空文件,這些操作通常由重定向完成。讀取它則會(huì)立即得到一個(gè)EOF。

    ?

    我們可以利用設(shè)個(gè)/dev/null屏蔽命令的輸出:

    $ cat Documents/test.c\~ nefile 1>/dev/null 2>&1

    ?

    ?

    向上面這樣的操作將使你得不到任何輸出結(jié)果。

    8.使用 xargs 分割參數(shù)列表

    xargs 是一條 UNIX 和類 UNIX 操作系統(tǒng)的常用命令。它的作用是將參數(shù)列表轉(zhuǎn)換成小塊分段傳遞給其他命令,以避免參數(shù)列表過長的問題。

    這個(gè)命令在有些時(shí)候十分有用,特別是當(dāng)用來處理產(chǎn)生大量輸出結(jié)果的命令如 find,locate 和 grep 的結(jié)果,詳細(xì)用法請參看 man 文檔。

    $ cut -d: -f1 < /etc/passwd | sort | xargs echo

    上面這個(gè)命令用于將/etc/passwd文件按:分割取第一個(gè)字段排序后,使用echo命令生成一個(gè)列表。

    ?24.一、正則表達(dá)式

    正則表達(dá)式,又稱正規(guī)表示式、正規(guī)表示法、正規(guī)表達(dá)式、規(guī)則表達(dá)式、常規(guī)表示法(英語:Regular Expression,在代碼中常簡寫為 regex、regexp 或 RE),計(jì)算機(jī)科學(xué)的一個(gè)概念。正則表達(dá)式使用單個(gè)字符串來描述、匹配一系列符合某個(gè)句法規(guī)則的字符串。在很多文本編輯器里,正則表達(dá)式通常被用來檢索、替換那些符合某個(gè)模式的文本。

    2.基本語法:

    ?一個(gè)正則表達(dá)式通常被稱為一個(gè)模式(pattern),為用來描述或者匹配一系列符合某個(gè)句法規(guī)則的字符串。

    ?

    選擇

    ?

    |豎直分隔符表示選擇,例如"boy|girl"可以匹配"boy"或者"girl"

    ?

    數(shù)量限定

    ?

    數(shù)量限定除了我們舉例用的*,還有+加號,?問號,.點(diǎn)號,如果在一個(gè)模式中不加數(shù)量限定符則表示出現(xiàn)一次且僅出現(xiàn)一次:

    • ?+表示前面的字符必須出現(xiàn)至少一次(1次或多次),例如,"goo+gle",可以匹配"gooogle","goooogle"等;
    • ??表示前面的字符最多出現(xiàn)一次(0次或1次),例如,"colou?r",可以匹配"color"或者"colour";
    • ?*星號代表前面的字符可以不出現(xiàn),也可以出現(xiàn)一次或者多次(0次、或1次、或多次),例如,“0*42”可以匹配42、042、0042、00042等。

    ?

    范圍和優(yōu)先級

    ?

    ()圓括號可以用來定義模式字符串的范圍和優(yōu)先級,這可以簡單的理解為是否將括號內(nèi)的模式串作為一個(gè)整體。例如,"gr(a|e)y"等價(jià)于"gray|grey",(這里體現(xiàn)了優(yōu)先級,豎直分隔符用于選擇a或者e而不是gra和ey),"(grand)?father"匹配father和grandfather(這里體驗(yàn)了范圍,?將圓括號內(nèi)容作為一個(gè)整體匹配)。

    ?

    語法(部分)

    ?

    正則表達(dá)式有多種不同的風(fēng)格,下面列舉一些常用的作為 PCRE 子集的適用于perl和python編程語言及grep或egrep的正則表達(dá)式匹配規(guī)則:(由于markdown表格解析的問題,下面的豎直分隔符用全角字符代替,實(shí)際使用時(shí)請換回半角字符)

    ?

    ?

    PCRE(Perl Compatible Regular Expressions中文含義:perl語言兼容正則表達(dá)式)是一個(gè)用 C 語言編寫的正則表達(dá)式函數(shù)庫,由菲利普.海澤(Philip Hazel)編寫。PCRE是一個(gè)輕量級的函數(shù)庫,比Boost 之類的正則表達(dá)式庫小得多。PCRE 十分易用,同時(shí)功能也很強(qiáng)大,性能超過了 POSIX 正則表達(dá)式庫和一些經(jīng)典的正則表達(dá)式庫。

    ?

    ?

    字符

    ?

    描述

    ?

    ?

    \ 將下一個(gè)字符標(biāo)記為一個(gè)特殊字符、或一個(gè)原義字符。例如,“n”匹配字符“n”。“\n”匹配一個(gè)換行符。序列“\\”匹配“\”而“\(”則匹配“(”。

    ^ 匹配輸入字符串的開始位置。

    $ 匹配輸入字符串的結(jié)束位置。

    {n} n是一個(gè)非負(fù)整數(shù)。匹配確定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的兩個(gè)o。

    {n,} n是一個(gè)非負(fù)整數(shù)。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等價(jià)于“o+”。“o{0,}”則等價(jià)于“o*”。

    {n,m} m和n均為非負(fù)整數(shù),其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”將匹配“fooooood”中的前三個(gè)o。“o{0,1}”等價(jià)于“o?”。請注意在逗號和兩個(gè)數(shù)之間不能有空格。

    * 匹配前面的子表達(dá)式零次或多次。例如,zo*能匹配“z”、“zo”以及“zoo”。*等價(jià)于{0,}。

    + 匹配前面的子表達(dá)式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等價(jià)于{1,}。

    ? 匹配前面的子表達(dá)式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等價(jià)于{0,1}。

    ? 當(dāng)該字符緊跟在任何一個(gè)其他限制符(*,+,?,{n},{n,},{n,m})后面時(shí),匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而默認(rèn)的貪婪模式則盡可能多的匹配所搜索的字符串。例如,對于字符串“oooo”,“o+?”將匹配單個(gè)“o”,而“o+”將匹配所有“o”。

    . 匹配除“\n”之外的任何單個(gè)字符。要匹配包括“\n”在內(nèi)的任何字符,請使用像“(.|\n)”的模式。

    (pattern) 匹配pattern并獲取這一匹配的子字符串。該子字符串用于向后引用。要匹配圓括號字符,請使用“\(”或“\)”。

    x|y 匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”則匹配“zood”或“food”。

    [xyz] 字符集合(character class)。匹配所包含的任意一個(gè)字符。例如,“[abc]”可以匹配“plain”中的“a”。其中特殊字符僅有反斜線\保持特殊含義,用于轉(zhuǎn)義字符。其它特殊字符如星號、加號、各種括號等均作為普通字符。脫字符^如果出現(xiàn)在首位則表示負(fù)值字符集合;如果出現(xiàn)在字符串中間就僅作為普通字符。連字符 - 如果出現(xiàn)在字符串中間表示字符范圍描述;如果如果出現(xiàn)在首位則僅作為普通字符。

    [^xyz] 排除型(negate)字符集合。匹配未列出的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”。

    [a-z] 字符范圍。匹配指定范圍內(nèi)的任意字符。例如,“[a-z]”可以匹配“a”到“z”范圍內(nèi)的任意小寫字母字符。

    [^a-z] 排除型的字符范圍。匹配任何不在指定范圍內(nèi)的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范圍內(nèi)的任意字符。

    ?

    優(yōu)先級

    ?

    優(yōu)先級為從上到下從左到右,依次降低:

    ?

    ?

    運(yùn)算符

    ?

    說明

    ?

    ?

    \ 轉(zhuǎn)義符

    (), (?:), (?=), [] 括號和中括號

    *、+、?、{n}、{n,}、{n,m} 限定符

    ^、$、\任何元字符 定位點(diǎn)和序列?

    |  選擇

    ?

    更多正則表達(dá)式的內(nèi)容可以參考以下鏈接:

    • ?正則表達(dá)式wiki
    • ?幾種正則表達(dá)式引擎的語法差異
    • ?各語言各平臺對正則表達(dá)式的支持

    ?

    二、grep模式匹配命令

    ?

    上面空談了那么多正則表達(dá)式的內(nèi)容也并沒有提及具體該如何使用它,實(shí)在枯燥,如果說正則表達(dá)式是一門武功話,那它也只能算得上一些口訣招式罷了,要把它真正練起來還得需要一些兵器在手才行,這里我們要介紹的grep命令以及后面要講的sed,awk這些就該算作是這樣的兵器了。

    ?

    1.基本操作

    ?

    grep命令用于打印輸出文本中匹配的模式串,它使用正則表達(dá)式作為模式匹配的條件。grep支持三種正則表達(dá)式引擎,分別用三個(gè)參數(shù)指定:

    ?

    ?

    參數(shù)

    ?

    說明

    ?

    ?

    -E POSIX擴(kuò)展正則表達(dá)式,ERE

    -G POSIX基本正則表達(dá)式,BRE

    -P Perl正則表達(dá)式,PCRE

    ?

    不過在你沒學(xué)過perl語言的大多數(shù)情況下你將只會(huì)使用到ERE和BRE,所以我們接下來的內(nèi)容都不會(huì)討論到PCRE中特有的一些正則表達(dá)式語法(它們之間大部分內(nèi)容是存在交集的,所以你不用擔(dān)心會(huì)遺漏多少重要內(nèi)容)

    ?

    在通過grep命令使用正則表達(dá)式之前,先介紹一下它的常用參數(shù):

    ?

    ?

    參數(shù)

    ?

    說明

    ?

    ?

    -b 將二進(jìn)制文件作為文本來進(jìn)行匹配

    -c 統(tǒng)計(jì)以模式匹配的數(shù)目

    -i 忽略大小寫

    -n 顯示匹配文本所在行的行號

    -v 反選,輸出不匹配行的內(nèi)容

    -r 遞歸匹配查找

    -A n n為正整數(shù),表示after的意思,除了列出匹配行之外,還列出后面的n行

    -B n n為正整數(shù),表示before的意思,除了列出匹配行之外,還列出前面的n行

    --color=auto 將輸出中的匹配項(xiàng)設(shè)置為自動(dòng)顏色顯示

    ?

    ?

    注:在大多數(shù)發(fā)行版中是默認(rèn)設(shè)置了grep的顏色的,你可以通過參數(shù)指定或修改GREP_COLOR環(huán)境變量。

    2.使用正則表達(dá)式

    ?

    使用基本正則表達(dá)式,BRE

    • ?位置

    ?

    查找/etc/group文件中以"shiyanlou"為開頭的行

    $ grep 'shiyanlou' /etc/group

    $ grep '^shiyanlou' /etc/group

    • ?數(shù)量

    # 將匹配以'z'開頭以'o'結(jié)尾的所有字符串

    $ echo 'zero\nzo\nzoo' | grep 'z.*o'

    # 將匹配以'z'開頭以'o'結(jié)尾,中間包含一個(gè)任意字符的字符串

    $ echo 'zero\nzo\nzoo' | grep 'z.o'

    # 將匹配以'z'開頭,以任意多個(gè)'o'結(jié)尾的字符串

    $ echo 'zero\nzo\nzoo' | grep 'zo*'

    • ?選擇

    # grep默認(rèn)是區(qū)分大小寫的,這里將匹配所有的小寫字母

    $ echo '1234\nabcd' | grep '[a-z]'

    # 將匹配所有的數(shù)字

    $ echo '1234\nabcd' | grep '[0-9]'

    # 將匹配所有的數(shù)字

    $ echo '1234\nabcd' | grep '[[:digit:]]'

    # 將匹配所有的小寫字母

    $ echo '1234\nabcd' | grep '[[:lower:]]'

    # 將匹配所有的大寫字母

    $ echo '1234\nabcd' | grep '[[:upper:]]'

    # 將匹配所有的字母和數(shù)字,包括0-9,a-z,A-Z

    $ echo '1234\nabcd' | grep '[[:alnum:]]'

    # 將匹配所有的字母

    $ echo '1234\nabcd' | grep '[[:alpha:]]'

    下面包含完整的特殊符號及說明:

    ?

    ?

    特殊符號

    ?

    說明

    ?

    ?

    [:alnum:] 代表英文大小寫字節(jié)及數(shù)字,亦即 0-9, A-Z, a-z

    [:alpha:] 代表任何英文大小寫字節(jié),亦即 A-Z, a-z

    [:blank:] 代表空白鍵與 [Tab] 按鍵兩者

    [:cntrl:] 代表鍵盤上面的控制按鍵,亦即包括 CR, LF, Tab, Del.. 等等

    [:digit:] 代表數(shù)字而已,亦即 0-9

    [:graph:] 除了空白字節(jié) (空白鍵與 [Tab] 按鍵) 外的其他所有按鍵

    [:lower:] 代表小寫字節(jié),亦即 a-z

    [:print:] 代表任何可以被列印出來的字節(jié)

    [:punct:] 代表標(biāo)點(diǎn)符號 (punctuation symbol),亦即:" ' ? ! ; : # $...

    [:upper:] 代表大寫字節(jié),亦即 A-Z

    [:space:] 任何會(huì)產(chǎn)生空白的字節(jié),包括空白鍵, [Tab], CR 等等

    [:xdigit:] 代表 16 進(jìn)位的數(shù)字類型,因此包括: 0-9, A-F, a-f 的數(shù)字與字節(jié)

    # 排除字符

    $ echo 'geek|good' | grep '[^o]'

    注意:當(dāng)^放到中括號內(nèi)為排除字符,否則表示行首。

    三、sed 流編輯器

    ?

    sed工具在 man 手冊里面的全名為"sed - stream editor for filtering and transforming text ",意即,用于過濾和轉(zhuǎn)換文本的流編輯器。

    ?

    在 Linux/UNIX 的世界里敢稱為編輯器的工具,大都非等閑之輩,比如前面的"vi/vim(編輯器之神)","emacs(神的編輯器)","gedit"這些個(gè)編輯器。sed與上述的最大不同之處大于它是一個(gè)非交互式的編輯器,下面我們就開始介紹sed這個(gè)編輯器。

    ?

    sed常用參數(shù)介紹

    ?

    sed 命令基本格式:

    sed [參數(shù)]... [執(zhí)行命令] [輸入文件]...

    # 形如:

    $ sed -i '1s/sad/happy/' test # 表示將test文件中第一行的"sad"替換為"happy"

    ?

    ?

    ?

    參數(shù)

    ?

    說明

    ?

    ?

    -n 安靜模式,只打印受影響的行,默認(rèn)打印輸入數(shù)據(jù)的全部內(nèi)容

    -e 用于在腳本中添加多個(gè)執(zhí)行命令一次執(zhí)行,在命令行中執(zhí)行多個(gè)命令通常不需要加該參數(shù)

    -f filename 指定執(zhí)行filename文件中的命令

    -r 使用擴(kuò)展正則表達(dá)式,默認(rèn)為標(biāo)準(zhǔn)正則表達(dá)式

    -i 將直接修改輸入文件內(nèi)容,而不是打印到標(biāo)準(zhǔn)輸出設(shè)備

    ?

    sed編輯器的執(zhí)行命令(這里”執(zhí)行“解釋為名詞)

    ?

    sed執(zhí)行命令格式:

    [n1][,n2]command

    [n1][~step]command

    # 其中一些命令可以在后面加上作用范圍,形如:

    $ sed -i 's/sad/happy/g' test # g表示全局范圍

    $ sed -i 's/sad/happy/4' test # 4表示指定行中的第四個(gè)匹配字符串

    ?

    ?

    其中n1,n2表示輸入內(nèi)容的行號,它們之間為,逗號則表示從n1到n2行,如果為~波浪號則表示從n1開始以step為步進(jìn)的所有行;command為執(zhí)行動(dòng)作,下面為一些常用動(dòng)作指令:

    ?

    ?

    命令

    ?

    說明

    ?

    ?

    s 行內(nèi)替換

    c 整行替換

    a 插入到指定行的后面

    i 插入到指定行的前面

    p 打印指定行,通常與-n參數(shù)配合使用

    d 刪除指定行

    ?

    sed操作舉例

    ?

    我們先找一個(gè)用于練習(xí)的文本文件:

    $ cp /etc/passwd ~

    ?

    ?

    打印指定行

    # 打印2-5行

    $ nl passwd | sed -n '2,5p'

    # 打印奇數(shù)行

    $ nl passwd | sed -n '1~2p'

    行內(nèi)替換

    # 將輸入文本中"shiyanlou" 全局替換為"hehe",并只打印替換的那一行,注意這里不能省略最后的"p"命令

    $ sed -n 's/shiyanlou/hehe/gp' passwd

    ?

    ?

    ?

    注意: 行內(nèi)替換可以結(jié)合正則表達(dá)式使用。

    ?

    行間替換

    $ nl passwd | grep "shiyanlou"

    # 刪除第21行

    $ sed -n '21c\www.shiyanlou.com' passwd

    四、awk文本處理語言

    在我們的環(huán)境中ubuntu上,默認(rèn)提供的是mawk,不過我們通常可以直接使用awk命令(awk語言的解釋器),因?yàn)橄到y(tǒng)已經(jīng)為我們創(chuàng)建好了awk指向mawk的符號鏈接。

    $ ll /usr/bin/awk

    2.awk的一些基礎(chǔ)概念

    ?

    awk所有的操作都是基于pattern(模式)—action(動(dòng)作)對來完成的,如下面的形式:

    $ pattern {action}

    .awk命令基本格式

    awk [-F fs] [-v var=value] [-f prog-file | 'program text'] [file...]

    ?

    ?

    其中-F參數(shù)用于預(yù)先指定前面提到的字段分隔符(還有其他指定字段的方式) ,-v用于預(yù)先為awk程序指定變量,-f參數(shù)用于指定awk命令要執(zhí)行的程序文件,或者在不加-f參數(shù)的情況下直接將程序語句放在這里,最后為awk需要處理的文本輸入,且可以同時(shí)輸入多個(gè)文本文件。

    4.awk操作體驗(yàn)

    ?

    先用vim新建一個(gè)文本文檔

    $ vim test

    ?

    ?

    包含如下內(nèi)容:

    I like linux

    www.shiyanlou.com

    ?

    • ?使用awk將文本內(nèi)容打印到終端

    # "quote>" 不用輸入

    $ awk '{

    > print

    > }' test

    # 或者寫到一行

    $ awk '{print}' test

    • ?將test的第一行的每個(gè)字段單獨(dú)顯示為一行

    $ awk '{

    > if(NR==1){

    > print $1 "\n" $2 "\n" $3

    > } else {

    > print}

    > }' test

    ?

    # 或者

    $ awk '{

    > if(NR==1){

    > OFS="\n"

    > print $1, $2, $3

    > } else {

    > print}

    > }' test

    • ?將test的第二行的以點(diǎn)為分段的字段換成以空格為分隔

    $ awk -F'.' '{

    > if(NR==2){

    > print $1 "\t" $2 "\t" $3

    > }}' test

    ?

    # 或者

    $ awk '

    > BEGIN{

    > FS="."

    > OFS="\t"? # 如果寫為一行,兩個(gè)動(dòng)作語句之間應(yīng)該以";"號分開?

    > }{

    > if(NR==2){

    > print $1, $2, $3

    > }}' test

    6.awk常用的內(nèi)置變量

    ?

    ?

    變量名

    ?

    說明

    ?

    ?

    FILENAME 當(dāng)前輸入文件名,若有多個(gè)文件,則只表示第一個(gè)。如果輸入是來自標(biāo)準(zhǔn)輸入,則為空字符串

    $0 當(dāng)前記錄的內(nèi)容

    $N N表示字段號,最大值為NF變量的值

    FS 字段分隔符,由正則表達(dá)式表示,默認(rèn)為" "空格

    RS 輸入記錄分隔符,默認(rèn)為"\n",即一行為一個(gè)記錄

    NF 當(dāng)前記錄字段數(shù)

    NR 已經(jīng)讀入的記錄數(shù)

    FNR 當(dāng)前輸入文件的記錄數(shù),請注意它與NR的區(qū)別

    OFS 輸出字段分隔符,默認(rèn)為" "空格

    ORS 輸出記錄分隔符,默認(rèn)為"\n"

    ?24.一、Linux 上的軟件安裝

    ?

    通常 Linux 上的軟件安裝主要有三種方式:

    ?在線安裝

    ?從磁盤安裝deb軟件包

    ?從二進(jìn)制軟件包安裝

    ?從源代碼編譯安裝

    二、在線安裝

    在 Linux 下,一個(gè)命令加回車,等待一下,軟件就安裝好了,這就是方便的在線安裝軟件的方式。比如我們想安裝一個(gè)軟件,名字叫做 w3m(w3m是一個(gè)命令行的簡易網(wǎng)頁瀏覽器),那么輸入如下命令:

    $ sudo apt-get install w3m

    2. apt 包管理工具介紹

    ?

    ?

    APT是Advance Packaging Tool(高級包裝工具)的縮寫,是Debian及其派生發(fā)行版的軟件包管理器,APT可以自動(dòng)下載,配置,安裝二進(jìn)制或者源代碼格式的軟件包,因此簡化了Unix系統(tǒng)上管理軟件的過程。APT最早被設(shè)計(jì)成dpkg的前端,用來處理deb格式的軟件包。現(xiàn)在經(jīng)過APT-RPM組織修改,APT已經(jīng)可以安裝在支持RPM的系統(tǒng)管理RPM包。這個(gè)包管理器包含以 apt- 開頭的的多個(gè)工具,如 apt-get apt-cache apt-cdrom 等,在Debian系列的發(fā)行版中使用。

    ?

    當(dāng)你在執(zhí)行安裝操作時(shí),首先apt-get 工具會(huì)在本地的一個(gè)數(shù)據(jù)庫中搜索關(guān)于 w3m 軟件的相關(guān)信息,并根據(jù)這些信息在相關(guān)的服務(wù)器上下載軟件安裝,這里大家可能會(huì)一個(gè)疑問:既然是在線安裝軟件,為啥會(huì)在本地的數(shù)據(jù)庫中搜索?要解釋這個(gè)問題就得提到幾個(gè)名詞了:

    ?軟件源鏡像服務(wù)器

    ?軟件源

    .apt-get

    ?

    apt-get使用各用于處理apt包的公用程序集,我們可以用它來在線安裝、卸載和升級軟件包等,下面列出一些apt-get包含的常用的一些工具:

    ?

    ?

    工具

    ?

    說明

    ?

    ?

    install 其后加上軟件包名,用于安裝一個(gè)軟件包

    update 從軟件源鏡像服務(wù)器上下載/更新用于更新本地軟件源的軟件包列表

    upgrade 升級本地可更新的全部軟件包,但存在依賴問題時(shí)將不會(huì)升級,通常會(huì)在更新之前執(zhí)行一次update

    dist-upgrade 解決依賴關(guān)系并升級(存在一定危險(xiǎn)性)

    remove 移除已安裝的軟件包,包括與被移除軟件包有依賴關(guān)系的軟件包,但不包含軟件包的配置文件

    autoremove 移除之前被其他軟件包依賴,但現(xiàn)在不再被使用的軟件包

    purge 與remove相同,但會(huì)完全移除軟件包,包含其配置文件

    clean 移除下載到本地的已經(jīng)安裝的軟件包,默認(rèn)保存在/var/cache/apt/archives/

    autoclean 移除已安裝的軟件的舊版本軟件包

    ?

    下面是一些apt-get常用的參數(shù):

    ?

    ?

    參數(shù)

    ?

    說明

    ?

    ?

    -y 自動(dòng)回應(yīng)是否安裝軟件包的選項(xiàng),在一些自動(dòng)化安裝腳本中使用這個(gè)參數(shù)將十分有用

    -s 模擬安裝

    -q 靜默安裝方式,指定多個(gè)q或者-q=#,#表示數(shù)字,用于設(shè)定靜默級別,這在你不想要在安裝軟件包時(shí)屏幕輸出過多時(shí)很有用

    -f 修復(fù)損壞的依賴關(guān)系

    -d 只下載不安裝

    --reinstall 重新安裝已經(jīng)安裝但可能存在問題的軟件包

    --install-suggests 同時(shí)安裝APT給出的建議安裝的軟件包

    ?

    4.安裝軟件包

    ?

    關(guān)于安裝,如前面演示的一樣你只需要執(zhí)行apt-get install <軟件包名>即可,除了這一點(diǎn),你還應(yīng)該掌握的是如何重新安裝軟件包。 很多時(shí)候我們需要重新安裝一個(gè)軟件包,比如你的系統(tǒng)被破壞,或者一些錯(cuò)誤的配置導(dǎo)致軟件無法正常工作。

    ?

    你可以使用如下方式重新安裝:

    $ sudo apt-get --reinstall install w3m

    ?

    ?

    另一個(gè)你需要掌握的是,如何在不知道軟件包完整名的時(shí)候進(jìn)行安裝。通常我們是使用Tab鍵補(bǔ)全軟件包名,后面會(huì)介紹更好的方法來搜索軟件包。有時(shí)候你需要同時(shí)安裝多個(gè)軟件包,你還可以使用正則表達(dá)式匹配軟件包名進(jìn)行批量安裝。

    5.軟件升級

    # 更新軟件源

    $ sudo apt-get update

    # 升級沒有依賴問題的軟件包

    $ sudo apt-get upgrade

    # 升級并解決依賴關(guān)系

    $ sudo apt-get dist-upgrade

    ?

    ?

    6.卸載軟件

    ?

    如果你現(xiàn)在覺得 w3m 這個(gè)軟件不合自己的胃口,或者是找到了更好的,你需要卸載它,那么簡單!同樣是一個(gè)命令加回車 sudo apt-get remove w3m ,系統(tǒng)會(huì)有一個(gè)確認(rèn)的操作,之后這個(gè)軟件便“滾蛋了”。

    7.軟件搜索

    ?

    當(dāng)自己剛知道了一個(gè)軟件,想下載使用,需要確認(rèn)軟件倉庫里面有沒有,就需要用到搜索功能了,命令如下:

    sudo apt-cache search softname1 softname2 softname3……

    三、使用 dpkg 從本地磁盤安裝 deb 軟件包

    ?

  • dpkg 介紹
  • dpkg常用參數(shù)介紹:

    ?

    ?

    參數(shù)

    ?

    說明

    ?

    ?

    -i 安裝指定deb包

    -R 后面加上目錄名,用于安裝該目錄下的所有deb安裝包

    -r remove,移除某個(gè)已安裝的軟件包

    -I 顯示deb包文件的信息

    -s 顯示已安裝軟件的信息?

    -S 搜索已安裝的軟件包

    -L 顯示已安裝軟件包的目錄信息

    2.使用dpkg安裝deb軟件包

    ?

    我們先使用apt-get加上-d參數(shù)只下載不安裝,下載emacs編輯器的deb包,下載完成后,我們可以查看/var/cache/apt/archives/目錄下的內(nèi)容,然后我們將第一個(gè)deb拷貝到home目錄下,并使用dpkg安裝

    $ cp /var/cache/apt/archives/emacs24_24.3+1-4ubuntu1_amd64.deb ~

    # 安裝之前參看deb包的信息

    $ sudo dpkg -I emacs24_24.3+1-4ubuntu1_amd64.deb

    ?

    ?

    如你所見,這個(gè)包還額外依賴了一些軟件包,這意味著,如果主機(jī)目前沒有這些被依賴的軟件包,直接使用dpkg安裝可能會(huì)存在一些問題,因?yàn)閐pkg并不能為你解決依賴關(guān)系。

    # 使用dpkg安裝

    $ sudo dpkg -i emacs24_24.3+1-4ubuntu1_amd64.deb

    們將如何解決這個(gè)錯(cuò)誤了,這就要用到apt-get了,使用它的-f參數(shù)了,修復(fù)依賴關(guān)系的安裝

    $ sudo apt-get -f install

    3.查看已安裝軟件包的安裝目錄

    ?

    如果你依然在糾結(jié)到底linux將軟件安裝到了什么地方,那么很幸運(yùn)你將可以通過dpkg找到答案

    ?

    使用dpkg -L查看deb包目錄信息

    $ sudo dpkg -L emacs

    四、從二進(jìn)制包安裝

    ?

    二進(jìn)制包的安裝比較簡單,我們需要做的只是將從網(wǎng)絡(luò)上下載的二進(jìn)制包解壓后放到合適的目錄,然后將包含可執(zhí)行的主程序文件的目錄添加進(jìn)PATH環(huán)境變量即可,如果你不知道該放到什么位置,請重新復(fù)習(xí)第四節(jié)關(guān)于 Linux 目錄結(jié)構(gòu)的內(nèi)容。

    ?

    3. 課后作業(yè)

    課程第二節(jié)實(shí)驗(yàn)內(nèi)容,安裝banner,toilet,figlet

    課程第三節(jié)作業(yè):

    課程第四節(jié)作業(yè):

    課程第五節(jié)作業(yè):

    《黑客帝國》電影里滿屏幕代碼的“數(shù)字雨”,在 Linux 里面你也可以輕松實(shí)現(xiàn)這樣的效果,你只需要一個(gè)命令cmatri

    課程六作業(yè):

    天冷的時(shí)候,要是有個(gè)火爐就好了。這里有個(gè)有趣的程序:

    $ sudo apt-get install libaa-bin

    # 提示command not found,請自行解決

    $ aafire

    課程七作業(yè):

    cowsay命令,可以讓你在終端里以一種動(dòng)物說話的形式打印出一段話。

    ?

    課程八作業(yè):

    使用以前介紹過的方法,安裝aview和imagemagick,然后用asciiview命令顯示圖片,使用方法可以用 man 命令查看。

    課程九作業(yè):?dos 文本格式到 UNIX 文本格式的轉(zhuǎn)換

    #從dos?到unix文本格式轉(zhuǎn)換
    $?cat?-A?[dos]?|?tr?-d?'^M'?|?cat?-A?[dos]

    課程十作業(yè):之前介紹過一個(gè)在命令行將圖片轉(zhuǎn)換為 ascii 字符查看的工具 aview/asciiview,不過它是黑白的。現(xiàn)在,這里是個(gè)彩色的:

    $ sudo apt-get install caca-utils $ cacaview <pic_file> $ cacademo $ cacafire




    課程11作業(yè):
    ?

    ?

    ?參考論文:http://www.cricode.com/3388.html

    參考網(wǎng)站:http://blog.csdn.net/fan_hai_ping/article/details/8352087

    ?

    ?

    ?

    ?

    七、遇到的問題及解決

    ?

    1.第一次使用linux所以經(jīng)常忘記加空格,導(dǎo)致語句出錯(cuò)

    ? ? ?解決 :注意格式,多使用linux,熟練就好

    2.使用aview時(shí) 不會(huì)下載圖片。

    ? 解決:嘗試用實(shí)驗(yàn)樓自帶的瀏覽器直接輸入圖片地址 ?,成功!但是之后由于沒有放在shiyanlou目錄下,一度無法打開,后來移動(dòng)了就好了!

    轉(zhuǎn)載于:https://www.cnblogs.com/yg137565645/p/4824426.html

    總結(jié)

    以上是生活随笔為你收集整理的5233杨光--Linux第一次实验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。