Linux基礎入門學習筆記20135227黃曉妍


學習計時:共24小時

讀書:1小時

代碼:8小時

作業:3小時

博客:12小時

一、學習目標

1. 能夠獨立安裝Linux操作系統  
2. 能夠熟練使用Linux系統的基本命令  
3. 熟練使用Linux中用戶管理命令/系統相關命令/文件目錄相關命令/打包壓縮相關命令/比較合並相關命令/網絡相關命令等
4. 熟練應用“搜索”進行舉一反三的學習
 

二、學習資源

1. 課程資料:https://www.shiyanlou.com/courses/413   實驗一,課程邀請碼:W7FQKW4Y

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

3.  Linux命令:en   cn

三、學習方法

1.  進度很重要:必須跟上每周的進度,閱讀,練習,問答,項目。我會認真對待每一位同學,請你不要因為困難半途而廢。

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

四、學習任務

(提示:請將要求學生完成的任務、測驗或思考題列在此處)

1. 重點學習 cheat/find/locate/grep/man/whereis/which/apt-get

   查找幫助文檔、各種示例多多練習,這幾個命令會貫穿我們整個學習的學習,掌握這幾個命令就可以很好學習其他命令了。

2. 這學期需要掌握的命令有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. 測試示例:

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

 

、后續學習預告(可選):

Linux下C語言編程基礎:
VIM進行編輯
GCC進行編譯
GDB進行調試
Make進行自動化

、學習過程

 

1. 重要知識點總結梳理:

  1.操作系統:是系統調用和內核那兩層,當然直觀的來看,我們使用的操作系統還包含一些在其上運行的應用程序,比如文本編輯器,瀏覽器,電子郵件。

  2.最初的操作系統當時的操作系統能運行批處理程序。批處理程序不需要用戶的交互,它從文件或者穿孔卡片讀取數據,然后輸出到另外一個文件或者打印機。

二十世紀六十年代初,交互式操作系統開始流行。它不僅僅可以交互,還能使多個用戶從不同的終端同時操作主機。這樣的操作系統被稱作分時操作系統。

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

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

  

  5.1).重要快捷鍵:

  真正學習命令行之前,你先要掌握幾個十分有用,必需掌握的小技巧:

  [Tab]

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

  [Ctrl+c]

  你就可以使用Ctrl+c鍵來強行終止當前程序(你可以放心它並不會使終端退出)。

其他一些常用快捷鍵

按鍵         作用

Ctrl+d      鍵盤輸入結束或退出終端

Ctrl+s      暫停當前程序,暫停后按下任意鍵恢復運行

Ctrl+z      將當前程序放到后台運行,恢復到前台為命令fg

Ctrl+a      將光標移至輸入行頭,相當於Home鍵

Ctrl+e      將光標移至輸入行末,相當於End鍵

Ctrl+k      刪除從光標所在位置到行末

Alt+Backspace 向前刪除一個單詞

Shift+PgUp 將終端顯示向上滾動

Shift+PgDn 將終端顯示向下滾動

  2).學會利用歷史輸入命令

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

  3).學會使用通配符

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

 

  建立多個文件的快捷方式

Shell 常用通配符:

字符         含義

*               匹配 0 或多個字符

?               匹配任意一個字符

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

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

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

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

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

 

4).學會在命令行中獲取幫助

 

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

 

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

區段         說明

1      一般命令

2      系統調用

3      庫函數,涵蓋了C標准函數庫

4      特殊文件(通常是/dev中的設備)和驅動程序

5      文件格式和約定

6      游戲和屏保

7      雜項

8      系統管理命令和守護進程

    要查看相應區段的內容,就在 man 后面加上相應區段的數字即可,如:

通常 man 手冊中的內容很多,你可能不太容易找到你想要的結果,不過幸運的是你可以在 man 中使用搜索,/<你要搜索的關鍵字>,查找到后你可以使用n鍵切換到下一個關鍵字所在處,shift+n為上一個關鍵字所在處。使用Space(空格鍵)翻頁,Enter(回車鍵)向下滾動一行,或者使用j,k(vim編輯器的移動鍵)進行向前向后滾動一行。按下h鍵為顯示使用幫助(因為man使用less作為閱讀器,實為less工具的幫助),按下q退出。

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

ls --help

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

  7.who 命令其它常用參數

      參數         說明

      -a      打印能打印的全部

      -d      打印死掉的進程

      -m    同am i,mom likes

      -q      打印當前登錄用戶數及用戶名

      -u      打印當前登錄用戶登錄信息

      -r      打印運行等級

  8.在 Linux 系統里, root 賬戶擁有整個系統至高無上的權利,比如 新建/添加 用戶。要創建用戶需要 root 權限,這里就要用到 sudo 這個命令了。不過使用這個命令有兩個大前提,一是你要知道當前登錄用戶的密碼,二是當前用戶必須在 sudo 用戶組。

   創建新用戶lilei,退出當前用戶跟退出終端一樣可以使用 exit 命令或者使用快捷鍵 Ctrl+d

  登陸新用戶lilei

  退出當前用戶lilei

  9.

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

 

方法一:使用groups命令

$ groups shiyanlou

 

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

 

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

$ cat /etc/group | sort

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

 

  使用 usermod 命令可以為用戶添加用戶組,同樣使用該命令你必需有 root 權限,你可以直接使用 root 用戶為其它用戶添加用戶組,或者用其它已經在 sudo 用戶組的用戶使用 sudo 命令獲取權限來執行該命令

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

$ su shiyanlou

$ groups lilei

$ sudo usermod -G sudo lilei

$ groups lilei

然后你再切換會 lilei 用戶,現在就可以使用 sudo 獲取 root 權限了。

  刪除用戶:

  10.查看文件權限

•文件類型

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

•文件權限

讀權限,表示你可以使用 cat <file name> 之類的命令來讀取某個文件的內容;寫權限,表示你可以編輯和修改某個文件; 執行權限,通常指可以運行的二進制程序文件或者腳本文件,如同 Windows 上的 'exe' 后綴的文件,不過 Linux 上不是通過文件后綴名來區分文件的類型。你需要注意的一點是,一個目錄要同時具有讀權限和執行權限才可以打開,而一個目錄要有寫權限才允許在其中創建其它文件,這是因為目錄文件實際保存着該目錄里面的文件的列表等信息

所有者權限,這一點相信你應該明白了,至於所屬用戶組權限,是指你所在的用戶組中的所有其它用戶對於該文件的權限,比如,你有一個艾派德,那么這個用戶組權限就決定了你的兄弟姐妹有沒有權限使用它破壞它和占有它。

•鏈接數

鏈接到該文件所在的 inode 結點的文件名數目(關於這個概念涉及到 Linux 文件系統的相關概念知識,不在本課程的討論范圍,感興趣的用戶可以自己去了解)。

•文件大小

inode 結點大小為單位來表示的文件大小,你可以給 ls 加上 -lh 參數來更直觀的查看文件的大小。

  ls的其他命令

 

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

      $ ls -A

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

      $ ls -Al

    顯示所有文件大小,並以普通人類能看懂的方式呈現:

      $ ls -dl <目錄名>

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

      $ ls -AsSh

   11.變更文件所有者

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

12.修改文件權限

•方式一:二進制數字表示

 

 

 

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

•方式二:加減賦值操作

 

13.

FHS 定義了兩層規范,第一層是, / 下面的各個目錄應該要放什么文件數據,例如 /etc 應該要放置設置文件,/bin 與 /sbin 則應該要放置可執行文件等等。

 第二層則是針對 /usr 及 /var 這兩個目錄的子目錄來定義。例如 /var/log 放置系統登錄文件、/usr/share 放置共享數據等等。

 

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

進入上一級目錄:

$ cd ..

 

 

進入你的“home”目錄:

$ cd ~

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

 

 

使用 pwd 獲取當前路徑:

$ pwd

絕對路徑

 關於絕對路徑,簡單地說就是以根"/"目錄為起點的完整路徑,以你所要到的目錄為終點,表現形式如: /usr/local/bin,表示根目錄下的 usr 目錄中的 local 目錄中的 bin 目錄。

 

相對路徑

 

相對路徑,也就是相對於你當前的目錄的路徑,相對路徑是以當前目錄 . 為起點,以你所要到的目錄為終點,表現形式如: usr/local/bin (這里假設你當前目錄為根目錄)。

提示:在進行目錄切換的過程中請多使用 Tab 鍵自動補全,可避免輸入錯誤,連續按兩次Tab可以顯示全部候選結果

1.新建

 新建空白文件

 使用 touch 命令創建空白文件,創建名為 test 的空白文件,因為在其他目錄沒有權限,所以需要先 cd ~ 切換回用戶的 /home/shiyanlou 目錄:

$ cd ~

$ touch test

 

新建目錄

 使用 mkdir(make directories)命令可以創建一個空目錄,也可同時指定創建目錄的權限屬性

 

創建名為"mydir"的空目錄:

$ mkdir mydir

 

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

$ mkdir -p father/son/grandson

2.復制

 

復制文件

 

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

$ cp test father/son/grandson

復制目錄

 

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

$ cp -r father family

3.刪除

 

刪除文件

 

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

$ rm test

你如果想忽略這提示,直接刪除文件,可以使用-f參數強制刪除:

$ rm -f test

刪除目錄

 

跟復制目錄一樣,要刪除一個目錄,也需要加上-r或-R參數:

$ rm -r family

4.移動文件與文件重命名

 

移動文件

 

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

$ mv file1 Documents

重命名文件

 

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

$ mv file1 myfile

5.查看文件

 

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

 

這兩個命令都是用來打印文件內容到標准輸出(終端),其中cat為正序顯示,tac倒序顯示。

nl命令,添加行號並打印,這是個比cat -n更專業的行號打印命令。

 

這里簡單列舉它的常用的幾個參數:

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

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

    -b t:只列出非空行的編號並列出(默認為這種方式)

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

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

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

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

-w : 行號字段占用的位數(默認為 6 位)

使用more工具打開passwd文件:

$ more passwd

這里想到系統新增加一個用戶,應該會將用戶的信息添加到passwd文件的最后,那么這時候我們就可以使用tail命令了:

$ tail /etc/passwd

 

 

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

$ tail -n 1 /etc/passwd

6.查看文件類型

 

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

$ file /bin/ls

7.編輯文件

$ vimtutor

  15.

一、環境變量

 1.變量

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

使用=號賦值運算符為變量 tmp 賦值為 shiyanlou:

$ tmp=shiyanlou

讀取變量的值,使用echo命令和$符號($符號用於表示引用一個變量的值,初學者經常會忘記輸入):

$ echo $tmp

2.環境變量

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

通常我們會涉及到的環境變量有三種:

•當前 Shell 進程私有用戶自定義變量,如上面我們創建的 temp 變量,只在當前 Shell 中有效。

•Shell 本身內建的變量。

•從自定義變量導出的環境變量。

 

也有三個與上述三種環境變量相關的命令,set,env,export。

 

命令  說明

set     顯示當前 Shell 所有環境變量,包括其內建環境變量(與 Shell 外觀等相關),用戶自定義變量及導出的環境變量

env      顯示與當前用戶相關的環境變量,還可以讓命令在指定環境中運行

export   顯示從 Shell 中導出成環境變量的變量,也能通過它將自定義變量導出為環境變量

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

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

 查看PATH環境變量的內容:

$ echo $PATH

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

創建一個 Shell 腳本文件:

$ vim hello_shell.sh

在腳本中添加如下內容,保存並退出(注意不要省掉第一行,這不是注釋,論壇有用戶反應會有語法錯誤,就是因為沒有了第一行):

#!/bin/zsh

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

    echo "hello shell"

done

exit 0

文件添加可執行權限:

$ chmod 755 hello_shell.sh

執行腳本

$ ./hello_shell.sh

創建一個 C 語言"hello world"程序:

$ vim hello_world.c

#include <stdio.h>

int main(void)

{

    printf("hello world!\n");

    return 0;

}

使用 gcc 生成可執行文件:

$ gcc -o hello_world hello_world.c

gcc 生成二進制文件默認具有可執行權限,不需要修改

在 shiyanlou 家目錄創建一個mybin目錄,並將上述 hello_shell.sh 和 hello_world 文件移動到其中:

$ mkdir mybin

$ mv hello_shell.sh hello_world mybin/

現在你可以在mybin目錄中分別運行你剛剛創建的兩個程序:

$ cd mybin

$ ./hello_shell.sh

$ ./hello_world

 4.添加自定義路徑到“PATH”環境變量

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

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

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

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

 

 

上述命令中>>表示將標准輸出以追加的方式重定向到一個文件中,注意前面用到的>是以覆蓋的方式重定向到一個文件中,使用的時候一定要注意分辨。在指定文件不存在的情況下都會創建新的文件。

5.修改和刪除已有變量

 

變量修改

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

變量設置方式         說明

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

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

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

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

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

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

 

變量刪除

可以使用unset命令刪除一個環境變量:

$ unset temp

 

6.如何讓環境變量立即生效

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

$ source .zshrc

$ . ./.zshrc

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

  16.搜索文件

與搜索相關的命令常用的有如下幾個whereis,which,find,locate。

 

•whereis簡單快速

$whereis who

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

•locate快而全

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

$ locate /usr/share/\*.jpg

注意要添加*號前面的反斜杠轉義,否則會無法找到

如果想只統計數目可以加上-c參數,-i參數可以忽略大小寫進行查找,whereis 的-b,-m,-s同樣可以是使用。

 which小而精

which本身是 Shell 內建的一個命令,我們通常使用which來確定是否安裝了某個指定的軟件,因為它只從PATH環境變量指定的路徑中去搜索命令:

$ which man

 •find精而細

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

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

$ find /etc/ -name interfaces

 注意 find 命令的路徑是作為第一個參數的, 基本命令格式為 find [path] [option] [action]

與時間相關的命令參數:

 

參數         說明

 

-atime 最后訪問時間 

 

-ctime 創建時間

 

-mtime 最后修改時間

 

 

 

下面以-mtime參數舉例:

 

•-mtime n: n 為數字,表示為在n天之前的”一天之內“修改過的文件

 

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

 

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

 

•newer file: file為一個已存在的文件,列出比file還要新的文件名

 

列出 home 目錄中,當天(24 小時之內)有改動的文件:

 

$ 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程序壓縮的文件

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

1.zip壓縮打包程序

•使用zip打包文件夾:

•設置壓縮級別為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

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

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

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

通過man 手冊可知:

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

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

•創建加密zip包

 

使用-e參數可以創建加密壓縮包:

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

 

 

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

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

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

將shiyanlou.zip解壓到當前目錄:

$ unzip shiyanlou.zip

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

$ unzip -q shiyanlou.zip -d ziptest

如果你不想解壓只想查看壓縮包的內容你可以使用-l參數:

$ unzip -l shiyanlou.zip

 

 

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

 

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

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

3.rar打包壓縮命令

 

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

•安裝rar和unrar工具:

$ sudo apt-get update

$ sudo apt-get install rar unrar

 

•從指定文件或目錄創建壓縮包或添加文件到壓縮包:

$ rm *.zip

$ rar a shiyanlou.rar .

 

 

上面的命令使用a參數添加一個目錄~到一個歸檔文件中,如果該文件不存在就會自動創建。

 

注意:rar 的命令參數沒有-,如果加上會報錯。

•從指定壓縮包文件中刪除某個文件:

$ 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 的解壓和壓縮都是同一個命令,只需參數不同,使用比較方便。

 

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

•創建一個 tar 包:

$ tar -cf shiyanlou.tar ~

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

$ mkdir tardir

$ tar -xf shiyanlou.tar -C tardir

 

•只查看不解包文件-t參數:

$ tar -tf shiyanlou.tar

 

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

$ tar -cphf etc.tar /etc

 

 

對於創建不同的壓縮格式的文件,對於tar來說是相當簡單的,需要的只是換一個參數,這里我們就以使用gzip工具創建*.tar.gz文件為例來說明。

•我們只需要在創建 tar 文件的基礎上添加-z參數,使用gzip來壓縮文件:

$ tar -czf shiyanlou.tar.gz ~

 

•解壓*.tar.gz文件:

$ tar -xzf shiyanlou.tar.gz

現在我們要使用其他的壓縮工具創建或解壓相應文件只需要更改一個參數即可:

壓縮文件格式         參數

*.tar.gz                     -z

*.tar.xz                      -J

*tar.bz2                      -j

19.簡單文件系統操作

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

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

$ df

$ df -h

現在你就可以使用命令查看你主機磁盤的使用情況了。至於掛載點如果你還記得前面第 4 節介紹 Linux 目錄樹結構的內容,那么你就應該能很好的理解掛載的概念,這里就不再贅述。

 使用 du 命令查看目錄的容量,這個命令前面其實已經用了很多次了:

# 默認同樣以 blocks 的大小展示

$ du

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

$ du -h

 

-d參數指定查看目錄的深度

# 只查看1級目錄的信息

$ du -h -d 0 ~

# 查看2級

$ du -h -d 1 ~

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

二、簡單的磁盤管理

下面涉及的命令具有一定的危險性,操作不當可能會丟失你的個人數據,初學者建議在虛擬環境中進行操作

 

  1. 創建虛擬磁盤

的命令行語句與其他的 Linux 程序不同,因為它的命令行選項格式為選項=值,而不是更標准的--選項 值或-選項=值。dd默認從標准輸入中讀取,並寫入到標准輸出中,但可以用選項if(input file,輸入文件)和of(output file,輸出文件)改變。

我們先來試試用dd命令從標准輸入讀入用戶輸入到標准輸出或者一個文件:

# 輸出到文件

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

# 輸出到標准輸出

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

將輸出的英文字符轉換為大寫再寫入文件:

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

使用 dd 命令創建虛擬鏡像文件

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

從/dev/zero設備創建一個容量為 256M 的空文件:

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

$ du -h virtual.img

 

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

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

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

$ mkfs.ext4 virtual.img

 

 

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

 

我們先來使用mount來查看下主機已經掛載的文件系統:

$ sudo mount

那么我們如何掛載真正的磁盤到目錄樹呢,mount命令的一般格式如下:

mount [options] [source] [directory]

 

 一些常用操作:

 

mount [-o [操作選項]] [-t 文件系統類型] [-w|--rw|--ro] [文件系統源] [掛載點]

我們現在直接來掛載我們創建的虛擬磁盤鏡像到/mnt目錄:

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

# 也可以省略掛載類型,很多時候 mount 會自動識別

# 以只讀方式掛載

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

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

 

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

# 命令格式 sudo umount 已掛載設備名或者掛載點,如:

$ sudo umount /mnt

我們重點開一下中間的分區信息,/dev/sda1,/dev/sda2 為主分區分別安裝了 Windows 和 Linux 操作系統,/dev/sda3 為交換分區(可以理解為虛擬內存),/dev/sda4 為擴展分區其中包含 /dev/sda5,/dev/sda6,/dev/sda7,/dev/sda8 四個邏輯分區,因為主機上有幾個分區之間有空隙,沒有對齊邊界扇區,所以分區之間的不是完全連續的。

 

# 進入磁盤分區模式

$ sudo fdisk virtual.img

使用 losetup 命令建立鏡像與回環設備的關聯

$ sudo losetup /dev/loop0 virtual.img

 

# 如果提示設備忙你也可以使用其它的回環設備,"ls /dev/loop*"參看所有回環設備# 解除設備關聯

 

$ sudo losetup -d /dev/loop0

然后再使用mkfs格式化各分區(前面我們是格式化整個虛擬磁盤鏡像文件或磁盤),不過格式化之前,我們還要為各分區建立虛擬設備的映射,用到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目錄下新建四個空目錄用於掛載虛擬磁盤:

 

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

# 掛載磁盤分區

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

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

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

# 卸載磁盤分區

$ sudo umount /dev/mapper/loop0p1

$ sudo umount /dev/mapper/loop0p5

$ sudo umount /dev/mapper/loop0p6

然后:

$ df -h

  20.一、命令執行順序的控制

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

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

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

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

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

 

  二、管道

1.試用

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

$ ls -al /etc

有太多內容,屏幕不能完全顯示,這時候可以使用滾動條或快捷鍵滾動窗口來查看。不過這時候可以使用管道:

$ ls -al /etc | less

 

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

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

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

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

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

 

# 前五個(包含第五個)

$ cut /etc/passwd -c -5

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

$ cut /etc/passwd -c 5-

# 第五個

$ cut /etc/passwd -c 5

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

$ cut /etc/passwd -c 2-5

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

grep命令是很強大的,也是相當常用的一個命令,它結合正則表達式可以實現很復雜卻很高效的匹配和查找,不過在學習正則表達式之前,這里介紹它簡單的使用,而關於正則表達式后面將會有單獨一小節介紹到時會再繼續學習grep命令和其他一些命令。

grep命令的一般形式為:grep [命令選項]... 用於匹配的表達式 [文件]...

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

$ grep -rnI "shiyanlou" ~

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

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

# 查看環境變量中以"yanlou"結尾的字符串

$ export | grep ".*yanlou$"

4. wc 命令,簡單小巧的計數工具

wc 命令用於統計並輸出一個文件中行、單詞和字節的數目,比如輸出/etc/passwd文件的統計信息:

$ wc /etc/passwd

 分別只輸出行數、單詞數、字節數、字符數和輸入文本中最長一行的字節數:

# 行數

$ wc -l /etc/passwd

# 單詞數

$ wc -w /etc/passwd

# 字節數

$ wc -c /etc/passwd

# 字符數

$ wc -m /etc/passwd

# 最長行字節數

$ wc -L /etc/passwd

注意:對於西文字符來說,一個字符就是一個字節,但對於中文字符一個漢字是大於2個字節的,具體數目是由字符編碼決定的

再來結合管道來操作一下,下面統計 /etc 下面所有目錄數:

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

5.sort 排序命令

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

默認為字典排序:

$ cat /etc/passswd | sort

 

反轉排序:

$ cat /etc/passwd | sort -r

按特定字段排序:

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

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

 

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

6. uniq 去重命令

uniq命令可以用於過濾或者輸出重復行。

 

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

 

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

不那么明顯,之所以不明顯是因為uniq命令只能去連續重復的行,不是全文去重,所以要達到預期效果,我們先排序:

 

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

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

 

  • •輸出重復行

# 輸出重復過的行(重復的只輸出一個)及重復次數

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

# 輸出所有重復的行

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

 21.文本處理命令

 

1.tr 命令

 

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

使用方式:

tr [option]...SET1 [SET2]

常用的選項有:

選項   說明

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

-s 去除set1指定的在輸入文本中連續並重復的字符

操作舉例:

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

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

# 將"hello" 中的ll,去重為一個l

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

# 將輸入文本,全部轉換為大寫或小寫輸出

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

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

2.col 命令

 

col 命令可以將Tab換成對等數量的空格建,或反轉這個操作。

 使用方式:

col [option]

常用的選項有:

選項            說明

-x 將Tab轉換為空格

-h 將空格轉換為Tab(默認選項)

 

操作舉例:

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

$ cat -A /etc/protocols

# 使用 col -x 將 /etc/protocols 中的 Tab 轉換為空格,然后再使用 cat 查看,你發現 ^I 不見了

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

3.join命令

學過數據庫的用戶對這個應該不會陌生,這個命令就是用於將兩個文件中包含相同內容的那一行合並在一起。

使用方式:

join [option]... file1 file2

常用的選項有:

選項            說明

-t 指定分隔符,默認為空格

-i 忽略大小寫的差異

-1 指明第一個文件要用哪個字段來對比,,默認對比第一個字段

-2 指明第二個文件要用哪個字段來對比,,默認對比第一個字段

 

操作舉例:

# 創建兩個文件

$ echo '1 hello' > file1

$ echo '1 shiyanlou' > file2

$ join file1 file2

# 將/etc/passwd與/etc/shadow兩個文件合並,指定以':'作為分隔符

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

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

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

4.paste命令

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

使用方式:

paste [option] file...

常用的選項有:

選項   說明

-d 指定合並的分隔符,默認為Tab

-s 不合並到一行,每個文件為一行

 

操作舉例:

$ echo hello > file1

$ echo shiyanlou > file2

$ echo www.shiyanlou.com > file3

$ paste -d ':' file1 file2 file3

$ paste -s file1 file2 file3

 

 

23.簡單的重定向

 在更多了解 Linux 的重定向之前,我們需要先知道一些基本的東西,前面我們已經提到過 Linux 默認提供了三個特殊設備,用於終端的顯示和輸出,分別為stdin(標准輸入,對應於你在終端的輸入),stdout(標准輸出,對應於終端的輸出),stderr(標准錯誤輸出,對應於終端的輸出)。

文件描述符

 

設備文件  說明

0 /dev/stdin 標准輸入

1 /dev/stdout 標准輸出

2 /dev/stderr 標准錯誤

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

 

默認使用終端的標准輸入作為命令的輸入和標准輸出作為命令的輸出

$ cat

(按Ctrl+C退出)

 

 

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

$ mkdir Documents

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

#include <stdio.h>

 

int main()

{

    printf("hello world\n");

    return 0;

}

 

EOF

 

 

將一個文件作為命令的輸入,標准輸出作為命令的輸出

$ cat Documents/test.c\~

 

 

將echo命令通過管道傳過來的數據作為cat命令的輸入,將標准輸出作為命令的輸出

$ echo 'hi' | cat

 

 

將echo命令的輸出從默認的標准輸出重定向到一個普通文件

$ echo 'hello shiyanlou' > redirect

$ cat redirect

.標准錯誤重定向

 

重定向標准輸出到文件,這是一個很實用的操作,另一個很實用的操作是將標准錯誤重定向,標准輸出和標准錯誤都被指向偽終端的屏幕顯示,所以我們經常看到的一個命令的輸出通常是同時包含了標准輸出和標准錯誤的結果的。比如下面的操作:

# 使用cat 命令同時讀取兩個文件,其中一個存在,另一個不存在

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

# 你可以看到除了正確輸出了前一個文件的內容,還在末尾出現了一條錯誤信息

# 下面我們將輸出重定向到一個文件,根據我們前面的經驗,這里將在看不到任何輸出了

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

# 將標准錯誤重定向到標准輸出,再將標准輸出重定向到文件,注意要將重定向到文件寫到前面

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

# 或者只用bash提供的特殊的重定向符號"&"將標准錯誤和標准輸出同時重定向到文件

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

 

 

注意你應該在輸出重定向文件描述符前加上&,否則shell會當做重定向到一個文件名為1的文件中

3.使用tee命令同時重定向到多個文件

 

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

$ echo 'hello shiyanlou' | tee hello

4.永久重定向

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

# 先開啟一個子 Shell

$ zsh

# 使用exec替換當前進程的重定向,將標准輸出重定向到一個文件

$ exec 1>somefile

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

$ ls

$ exit

$ cat somefile

5.創建輸出文件描述符

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

$ cd /dev/fd/;ls -Al

同樣使用exec命令可以創建新的文件描述符:

$ zsh

$ exec 3>somefile

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

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

# 注意下面的命令>與&之間不應該有空格,如果有空格則會出錯

$ echo "this is test" >&3

$ cat somefile

$ exit

 

6.關閉文件描述符

 

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

$ exec 3>&-

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

 

 

7.完全屏蔽命令的輸出

 

在 Linux 中有一個被成為“黑洞”的設備文件,所以導入它的數據都將被“吞噬”。

 

 

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

 

我們可以利用設個/dev/null屏蔽命令的輸出:

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

 

 

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

8.使用 xargs 分割參數列表

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

這個命令在有些時候十分有用,特別是當用來處理產生大量輸出結果的命令如 find,locate 和 grep 的結果,詳細用法請參看 man 文檔。

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

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

 24.一、正則表達式

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

2.基本語法:

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

 

選擇

 

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

 

數量限定

 

數量限定除了我們舉例用的*,還有+加號,?問號,.點號,如果在一個模式中不加數量限定符則表示出現一次且僅出現一次:

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

 

范圍和優先級

 

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

 

語法(部分)

 

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

 

 

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

 

 

字符

 

描述

 

 

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

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

$ 匹配輸入字符串的結束位置。

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

{n,} n是一個非負整數。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等價於“o+”。“o{0,}”則等價於“o*”。

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

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

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

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

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

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

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

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

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

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

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

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

 

優先級

 

優先級為從上到下從左到右,依次降低:

 

 

運算符

 

說明

 

 

\ 轉義符

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

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

^、$、\任何元字符 定位點和序列 

|  選擇

 

更多正則表達式的內容可以參考以下鏈接:

  • •正則表達式wiki
  • •幾種正則表達式引擎的語法差異
  • •各語言各平台對正則表達式的支持

 

二、grep模式匹配命令

 

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

 

1.基本操作

 

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

 

 

參數

 

說明

 

 

-E POSIX擴展正則表達式,ERE

-G POSIX基本正則表達式,BRE

-P Perl正則表達式,PCRE

 

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

 

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

 

 

參數

 

說明

 

 

-b 將二進制文件作為文本來進行匹配

-c 統計以模式匹配的數目

-i 忽略大小寫

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

-v 反選,輸出不匹配行的內容

-r 遞歸匹配查找

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

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

--color=auto 將輸出中的匹配項設置為自動顏色顯示

 

 

注:在大多數發行版中是默認設置了grep的顏色的,你可以通過參數指定或修改GREP_COLOR環境變量。

2.使用正則表達式

 

使用基本正則表達式,BRE

  • •位置

 

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

$ grep 'shiyanlou' /etc/group

$ grep '^shiyanlou' /etc/group

  • •數量

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

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

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

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

# 將匹配以'z'開頭,以任意多個'o'結尾的字符串

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

  • •選擇

# grep默認是區分大小寫的,這里將匹配所有的小寫字母

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

# 將匹配所有的數字

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

# 將匹配所有的數字

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

# 將匹配所有的小寫字母

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

# 將匹配所有的大寫字母

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

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

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

# 將匹配所有的字母

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

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

 

 

特殊符號

 

說明

 

 

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

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

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

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

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

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

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

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

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

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

[:space:] 任何會產生空白的字節,包括空白鍵, [Tab], CR 等等

[:xdigit:] 代表 16 進位的數字類型,因此包括: 0-9, A-F, a-f 的數字與字節

# 排除字符

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

注意:當^放到中括號內為排除字符,否則表示行首。

三、sed 流編輯器

 

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

 

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

 

sed常用參數介紹

 

sed 命令基本格式:

sed [參數]... [執行命令] [輸入文件]...

# 形如:

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

 

 

 

參數

 

說明

 

 

-n 安靜模式,只打印受影響的行,默認打印輸入數據的全部內容

-e 用於在腳本中添加多個執行命令一次執行,在命令行中執行多個命令通常不需要加該參數

-f filename 指定執行filename文件中的命令

-r 使用擴展正則表達式,默認為標准正則表達式

-i 將直接修改輸入文件內容,而不是打印到標准輸出設備

 

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

 

sed執行命令格式:

[n1][,n2]command

[n1][~step]command

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

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

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

 

 

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

 

 

命令

 

說明

 

 

s 行內替換

c 整行替換

a 插入到指定行的后面

i 插入到指定行的前面

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

d 刪除指定行

 

sed操作舉例

 

我們先找一個用於練習的文本文件:

$ cp /etc/passwd ~

 

 

打印指定行

# 打印2-5行

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

# 打印奇數行

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

行內替換

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

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

 

 

 

注意: 行內替換可以結合正則表達式使用。

 

行間替換

$ nl passwd | grep "shiyanlou"

# 刪除第21行

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

四、awk文本處理語言

在我們的環境中ubuntu上,默認提供的是mawk,不過我們通常可以直接使用awk命令(awk語言的解釋器),因為系統已經為我們創建好了awk指向mawk的符號鏈接。

$ ll /usr/bin/awk

2.awk的一些基礎概念

 

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

$ pattern {action}

.awk命令基本格式

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

 

 

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

4.awk操作體驗

 

先用vim新建一個文本文檔

$ vim test

 

 

包含如下內容:

I like linux

www.shiyanlou.com

 

  • •使用awk將文本內容打印到終端

# "quote>" 不用輸入

$ awk '{

> print

> }' test

# 或者寫到一行

$ awk '{print}' test

  • •將test的第一行的每個字段單獨顯示為一行

$ 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的第二行的以點為分段的字段換成以空格為分隔

$ awk -F'.' '{

> if(NR==2){

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

> }}' test

 

# 或者

$ awk '

> BEGIN{

> FS="."

> OFS="\t"  # 如果寫為一行,兩個動作語句之間應該以";"號分開 

> }{

> if(NR==2){

> print $1, $2, $3

> }}' test

6.awk常用的內置變量

 

 

變量名

 

說明

 

 

FILENAME 當前輸入文件名,若有多個文件,則只表示第一個。如果輸入是來自標准輸入,則為空字符串

$0 當前記錄的內容

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

FS 字段分隔符,由正則表達式表示,默認為" "空格

RS 輸入記錄分隔符,默認為"\n",即一行為一個記錄

NF 當前記錄字段數

NR 已經讀入的記錄數

FNR 當前輸入文件的記錄數,請注意它與NR的區別

OFS 輸出字段分隔符,默認為" "空格

ORS 輸出記錄分隔符,默認為"\n"

 24.一、Linux 上的軟件安裝

 

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

•在線安裝

•從磁盤安裝deb軟件包

•從二進制軟件包安裝

•從源代碼編譯安裝

二、在線安裝

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

$ sudo apt-get install w3m

2. apt 包管理工具介紹

 

 

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

 

當你在執行安裝操作時,首先apt-get 工具會在本地的一個數據庫中搜索關於 w3m 軟件的相關信息,並根據這些信息在相關的服務器上下載軟件安裝,這里大家可能會一個疑問:既然是在線安裝軟件,為啥會在本地的數據庫中搜索?要解釋這個問題就得提到幾個名詞了:

•軟件源鏡像服務器

•軟件源

.apt-get

 

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

 

 

工具

 

說明

 

 

install 其后加上軟件包名,用於安裝一個軟件包

update 從軟件源鏡像服務器上下載/更新用於更新本地軟件源的軟件包列表

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

dist-upgrade 解決依賴關系並升級(存在一定危險性)

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

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

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

clean 移除下載到本地的已經安裝的軟件包,默認保存在/var/cache/apt/archives/

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

 

下面是一些apt-get常用的參數:

 

 

參數

 

說明

 

 

-y 自動回應是否安裝軟件包的選項,在一些自動化安裝腳本中使用這個參數將十分有用

-s 模擬安裝

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

-f 修復損壞的依賴關系

-d 只下載不安裝

--reinstall 重新安裝已經安裝但可能存在問題的軟件包

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

 

4.安裝軟件包

 

關於安裝,如前面演示的一樣你只需要執行apt-get install <軟件包名>即可,除了這一點,你還應該掌握的是如何重新安裝軟件包。 很多時候我們需要重新安裝一個軟件包,比如你的系統被破壞,或者一些錯誤的配置導致軟件無法正常工作。

 

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

$ sudo apt-get --reinstall install w3m

 

 

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

5.軟件升級

# 更新軟件源

$ sudo apt-get update

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

$ sudo apt-get upgrade

# 升級並解決依賴關系

$ sudo apt-get dist-upgrade

 

 

6.卸載軟件

 

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

7.軟件搜索

 

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

sudo apt-cache search softname1 softname2 softname3……

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

 

  1. dpkg 介紹

dpkg常用參數介紹:

 

 

參數

 

說明

 

 

-i 安裝指定deb包

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

-r remove,移除某個已安裝的軟件包

-I 顯示deb包文件的信息

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

-S 搜索已安裝的軟件包

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

2.使用dpkg安裝deb軟件包

 

我們先使用apt-get加上-d參數只下載不安裝,下載emacs編輯器的deb包,下載完成后,我們可以查看/var/cache/apt/archives/目錄下的內容,然后我們將第一個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

 

 

如你所見,這個包還額外依賴了一些軟件包,這意味着,如果主機目前沒有這些被依賴的軟件包,直接使用dpkg安裝可能會存在一些問題,因為dpkg並不能為你解決依賴關系。

# 使用dpkg安裝

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

們將如何解決這個錯誤了,這就要用到apt-get了,使用它的-f參數了,修復依賴關系的安裝

$ sudo apt-get -f install

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

 

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

 

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

$ sudo dpkg -L emacs

四、從二進制包安裝

 

二進制包的安裝比較簡單,我們需要做的只是將從網絡上下載的二進制包解壓后放到合適的目錄,然后將包含可執行的主程序文件的目錄添加進PATH環境變量即可,如果你不知道該放到什么位置,請重新復習第四節關於 Linux 目錄結構的內容。

 

3. 課后作業

課程第二節實驗內容,安裝banner,toilet,figlet

課程第三節作業:

課程第四節作業:

課程第五節作業:

《黑客帝國》電影里滿屏幕代碼的“數字雨”,在 Linux 里面你也可以輕松實現這樣的效果,你只需要一個命令cmatrix。

課程六作業:

天冷的時候,要是有個火爐就好了。這里有個有趣的程序:

$ sudo apt-get install libaa-bin

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

$ aafire

課程七作業:

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

課程八作業:

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

課程九作業: dos 文本格式到 UNIX 文本格式的轉換

#從dos 到unix文本格式轉換
$ cat -A [dos] | tr -d '^M' | cat -A [dos]

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

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



課程11作業:

 

 

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

參考網站:http://blog.csdn.net/fan_hai_ping/article/details/8352087

 

 

 

 

七、遇到的問題及解決

1.在使用aview打開圖片時,由於terminal終端默認的用戶是shiyanlou,它是在shiyanlou下搜索文件,剛開始我將圖片放置於桌面,不能打開,將其移動到shiyanlou目錄下就能成功地打開圖片了。

 

3.

 

 

 

 

八、其他

(提示:此處由學生填寫,靈感,領悟等)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM