實驗1 Linux系統簡介
本節主要學習了 Linux 的歷史,Linux 與 Windows 的區別等入門知識。通過學習,我明確了目的,是要用 Linux 來做程序開發、搭建服務器等;並且非常接受不用或少用圖形界面;盡可能多學習一些Linux的發行版。在安裝Ubuntu時也遇到了不支持虛擬化的問題,進入BIOS設置得以解決。
實驗2 基本概念及操作
- 學習實踐
- 通配符
?
和*
的區別
?
匹配一個字符,*
匹配一個或者多個字符。 - 批量建立文件
- 作業
banner
命令
-w參數指定打印寬度,因為實驗樓的環境在屏幕中顯示比較小,必須要加上寬度限制。toilet
命令
flight
命令
實驗3 用戶及文件權限管理
- 學習實踐
- 切換用戶
- 添加用戶組
可以使用groups
命令,或者查看/etc/group
文件查看用戶組,使用usermod
添加用戶組。
- 更改文件所有者
使用chown
命令更改文件權限
- 權限更改
(1)數字更改權限
數字說明:
0 - 無權限
1 - 可執行
2 - 可寫
3 - 可寫可執行
4 - 可讀
5 - 可讀可執行
6 - 可讀可寫
7 - 可讀可寫可執行
三個數字分別對應文件所有者、所屬用戶組、其他用戶。
(2)加減賦值更改權限
u、g、o分別對應文件所有者、所屬用戶組、其他用戶。
+和-分別表示增加、去除權限。
r、w、x分別表示讀、寫、執行。
- 作業
題目:添加一個用戶 loutest,使用 sudo 創建文件 /opt/forloutest,設置成用戶 loutest 可以讀寫。
- 添加用戶loutest
- 用戶loutest加入sudo用戶組
- 切換用戶創建文件並修改權限
實驗4 Linux目錄結構及文件基本操作
FHS(英文:Filesystem Hierarchy Standard 中文:文件系統層次結構標准),多數 Linux 版本采用這種文件組織形式,FHS 定義了系統中每個區域的用途、所需要的最小構成的文件和目錄同時還給出了例外處理與矛盾處理。
FHS 定義了兩層規范,第一層是,/
下面的各個目錄應該要放什么文件數據,例如 /etc
應該放置設置文件,/bin
與/sbin
則應該放置可執行文件等等。第二層則是針對 /usr 及 /var 這兩個目錄的子目錄來定義。例如/var/log
放置系統日志文件,/usr/share
放置共享數據等等。
- 學習實踐
rename
批量修改文件名
修改文件名可以使用mv
命令,但是想要批量修改的話,需要使用rename
命令。
cat
和tac
命令(正反)
file
命令查看文件類型
- 作業
- 創建一個 homework 目錄,建立名為 1.txt~10.txt 文件,並刪除 1.txt~5.txt
- Linux的日志文件在哪個目錄?
日志文件基本在/var/log和/var/run中。
(1)/var/log/boot.log(自檢過程)
(2)/var/log/cron (crontab守護進程crond所派生的子進程的動作)
(3)/var/log/maillog (發送到系統或從系統發出的電子郵件的活動)
(4)/var/log/syslog (只記錄警告信息)
(5)/var/run/utmp
(6)/var/log/wtmp(記錄每個用戶登錄、注銷及系統的啟動、停機的事件)
(7)/var/run/utmp(記錄有關當前登錄的每個用戶的信息)
(8)/var/log/xferlog(記錄FTP會話)
實驗5 環境變量與文件查找
- 學習實踐
- 添加環境變量
- 添加自定義路徑且立即生效
- 搜索文件
whereis
--簡單快速
which
--小而精
find
--精而細
locate
--快而全,通過/var/lib/mlocate/mlocate.db
數據庫查找,不過這個數據庫也不是實時更新的,系統會使用定時任務每天自動執行updatedb
命令更新一次,所以有時候你剛添加的文件,它可能會找不到,需要手動執行一次updatedb
命令。
- 作業
題目:尋找文件。找出 /etc/ 目錄下的所有以 .list 結尾的文件
實驗樓的環境運行不了updatedb
命令,所以本次作業在自己電腦上進行。
挑戰1 尋找文件
- 目標:
- 找到
sources.list
文件(依稀記得在/etc/
目錄下) - 把文件所有者改為自己(shiyanlou)
- 把權限修改為僅僅只有自己可讀可寫
- 解答:
實驗6 文件打包與解壓縮
- 學習實踐
- zip打包
-r
表示遞歸打包,將目錄下所有文件打包。
-9
表示打包速度與大小等級設定,1表示最快壓縮但體積大,9表示體積最小但耗時最久。
-q
表示靜默打包,不向終端輸出信息。
-o
表示輸出文件。
- tar命令
-c
表示創建一個 tar 包文件
-x
表示解壓縮文件,只能解壓縮到一個已存在的目錄,所以下圖中第一次實現錯誤提示。
-f
用於指定創建的文件名,注意文件名必須緊跟在 -f 參數之后
- 作業
題目:創建一個名為 test 的文件,分別用 zip 和 tar 打包成壓縮包,再解壓到 /home/shiyanlou 目錄。
實驗7 文件系統操作與磁盤管理
- 學習實踐
- 創建虛擬磁盤
- 虛擬磁盤掛載
由於實驗樓環境的問題(環境中使用的 Linux 內核在編譯時沒有添加對 Loop device的支持),所以將無法掛載成功。
在自己機器上掛載成功。
- 作業
題目:找出當前目錄下面占用最大的前十個文件
du -a | sort -n -r | head -n 10
使用du
查看當前目錄,並使用-a
參數顯示大小,sort
進行排序,head
取前十。
實驗8 Linux下的幫助命令
- 學習實踐
Linux命令分為內建命令和外部命令。內建命令是 shell 程序的一部分,其中包含的是一些比較簡單的 Linux 系統命令,這些命令是寫在bash源碼的builtins里面的,並由 shell 程序識別並在 shell 程序內部完成運行,而且解析內部命令 shell 不需要創建子進程,因此其執行速度比外部命令快。比如:history、cd、exit 等等。外部命令是 Linux 系統中的實用程序部分,在系統加載時並不隨系統一起被加載到內存中,而是在需要時才將其調用內存。雖然其不包含在 shell 中,但是其命令執行過程是由 shell 程序控制的。外部命令是在 Bash 之外額外安裝的,通常放在/bin,/usr/bin,/sbin,/usr/sbin等等。比如:ls、vi等。
可以使用type
進行區分。
help
命令是用於顯示 shell 內建命令的簡要幫助信息。
man
沒有內建與外部命令的區分,顯示系統手冊頁中的內容,大多數都是對命令的解釋信息,還有一些相關的描述。
info
是 GNU 的超文本幫助系統,能夠更完整的顯示出 GNU 信息。
實驗9 Linux任務計划crontab
- 學習實踐
- crontab
添加*/1 * * * * touch /home/shiyanlou/$(date +\%Y\%m\%d\%H\%M\%S)
可以實現每分鍾在/home/shiyanlou
目錄下創建一個以當前的年月日時分秒為名字的空白文件。 - 查看守護進程
雖然剛剛添加了任務,但是如果cron
的守護進程並沒有啟動,它根本都不會監測到有任務,當然也就不會執行.可以通過以下2種方式來確定cron
是否成功的在后台啟動。
- 查看文件,可以看到已經自動執行了幾次
挑戰2 備份日志
- 目標:
- 為shiyanlou用戶添加計划任務。
- 每天凌晨3點的時候定時備份alternatives.log到/home/shiyanlou/tmp/目錄。
- 命名格式為年-月-日,比如今天是2017年4月1日,那么文件名為2017-04-01。
- 解答:
使用crontab -e
為當前用戶添加計划任務,此時不能使用sudo,否則是給root用戶添加計划任務。
添加如下代碼即可:
0 3 * * * cp alternatives.log /home/shiyanlou/tmp/$(date +\%Y-\%m-\%d)
實驗10 命令執行順序控制與管道
- 學習實踐
- 有選擇的執行命令
&& 表示前一條命令執行成功時才執行后一條命令,|| 表示上一條命令執行失敗后才執行下一條命令
- cut命令,1,6顯示第1和第6段,1~6顯示1到6段。
wc
計數命令
wc 命令用於統計並輸出一個文件中行、單詞和字節的數目。
-l
:行數
-w
:單詞數
-c
:字節數
-m
:字符數
-L
:最長行字節數
wc
結合管道,統計/etc
下面所有目錄數
實驗11 簡單的文本處理
- 學習實踐
tr命令可以用來刪除一段文本信息中的某些文字。或者將其進行轉換。
-d參數:刪除。
-s參數:去重。 - 作業
題目:在不使用轉換工具的情況下,使用學過的命令手動完成 dos 文本格式到 UNIX 文本格式的轉換。
使用tr -d '\r' <test.txt> tes.txt
進行轉換,將test.txt轉換為tst.txt。
實驗12 數據流重定向
- 學習實踐
- 重定向
分別進行:將cat
的連續輸出(heredoc方式)重定向到一個文件;
將echo
命令通過管道傳過來的數據作為cat命令的輸入,將標准輸出作為命令的輸出;
將echo
命令的輸出從默認的標准輸出重定向到一個普通文件。
- 標准錯誤定向到標准輸出再定向到文件
標准錯誤不能直接定向到標准輸出,可以用以下兩種方式:
tee
命令同時重定向到文件和終端
exec
實現shell重定向
- 創建、關閉文件描述符
- 作業
題目:理解下面這段代碼的作用,實際這段代碼不會正常工作,請結合這一小節的知識分析這段代碼沒有正確工作的原因,並設法解決這個問題。
while read filename; do
rm -iv $filename
done <<(ls)
理解:這段代碼的本意是讀取當前目錄的文件列表,並有交互地刪除。
rm -iv
的作用是在刪除時進行交互,並且顯示步驟。它期待用戶從標准輸入中輸入y或者n來進行是否刪除的操作,但是標准輸入被<<(ls)
重定向了,rm
命令在 <<(ls)
中尋找y或者n,找不到就中斷退出了。
解決:標准輸入一定要給到循環體,此時將標准輸入復制一份,給予rm -iv
命令進行交互即可。
exec 8<&0 //此時使用3~8均可
while read filename; do
rm --iv $filename <&8
done <<(ls)
挑戰3 歷史命令
- 目標:
- 處理文本data
- 將結果寫入result
- 結果包含次數和命令,如“
100 ls
”
- 解答:
cat data1 | cut -c 8- | sort |uniq -dc | sort -n -r | head -3 > result
實驗13 正則表達式基礎
- 學習實踐
grep
操作,使用正則表達式(作業:結合正則表達式做更多練習)
注意:當^
放到中括號內為排除字符,否則表示行首。
- 使用擴展正則表達式,加
-E
,不加則不執行
sed
sed
工具用於過濾和轉換文本的流編輯器。打印奇數行,並將"shiyanlou" 全局替換為"ly"。
p
通常與-n
參數配合使用,不能省略最后的p
命令。
awk
文本處理語言
\t
要用雙引號。
- 作業
題目:基於 pattern space 和 hold space 實現將一個文本倒序輸出和交換奇數行和偶數行。
- 反序
sed '1!G;h;$!d' test.txt
1!G
—— 只有第一行不執行G命令,將hold space中的內容append回到pattern space
h
—— 第一行都執行h命令,將pattern space中的內容拷貝到hold space中
$!d
—— 最后一行不執行。其它行執行d命令,刪除當前行
- 奇偶互換
sed -n 'h;$!{n;G};p' test.txt
-n
—— -n參數靜默模式,只打印受影響的行
h
—— 將pattern space中內容拷貝到 hold space中
$!{n,G}
—— 最后一行不執行。n進入下一行,G將hold space中內容append到pattern space中,appttern space中的兩行位置交換了
p
—— 打印出交換后的兩行
注意:最后一行不執行的目的,是如果最后一行是奇數行,不需要交換直接打印。
挑戰4 數據提取
- 目標:
在文件data2中匹配數字開頭的行,結果寫入/home/shiyanlou/num
文件
在文件data2中匹配出正確格式的郵箱,結果寫入一個名為/home/shiyanlou/mail
的文件 - 解答:
- data2的內容
- 匹配數字開頭的行
grep '^[[:digit:]]' data2>num
- 匹配正確格式郵箱
grep'^[[:alnum:]]*@[[:alnum:]]*\.com' data2>mail
實驗14 Linux下軟件安裝
- 學習實踐
apt-get
是用於處理 apt包的公用程序集,我們可以用它來在線安裝、卸載和升級軟件包等。
比較有用的幾個參數:
-f
——修復損壞的依賴關系
-d
——只下載不安裝
--reinstall
——重新安裝已經安裝但可能存在問題的軟件包dpkg
工具——"Debian Package"的簡寫
可以安裝deb
形式打包的軟件包。- 從二進制包安裝
二進制包的安裝比較簡單,將從網絡上下載的二進制包解壓后放到合適的目錄,然后將包含可執行的主程序文件的目錄添加進PATH環境變量即可。
實驗15、16 Linux 進程概念和管理
通過這兩節大致了解進程的概念、進程之間存在的相互關系、進程的查看命令ps
、pstree
、top
、進程的管理命令kill
、nice
、renice
等。
實驗17 Linux 日志系統
通過本實驗,了解了較新的系統日志收集工具rsyslog及其配置文件,還有一個日志文件管理工具logrotate
,省心省力,不但可以壓縮日志文件,減少存儲空間,還可以將日志發送到指定E-mail,方便管理員及時查看日志。logrotate
是基於CRON
來運行的,其腳本是 /etc/cron.daily/logrotate
;同時我們可以在 /etc/logrotate
中找到其配置文件。
小結
本次進行了共計21個實驗,即使以前使用過Ubuntu系統,也學習到了很多新的知識,將我對Linux系統的認識扳回了正確的方向,即使表面相似,內部的原理也是大有不同的。學習了很多知識,但是很多命令還不熟練,需要自己在實際使用中加深理解,熟練使用。