2.2.3 head-tail 命令
#------head
#head pass #檢視頭部內容,預設前10行
#head -n5 pass #檢視頭部前5行,使用-n指定
#-------tail
#tail pass
# tail -20 /var/log/secure
#tail -f /var/log/messages #-f檢視檔案尾部的變化
# tailf /var/log/messages # 檢視檔案尾部的變化
2.2.4 grep 過濾資料
#----------grep過濾檔案內容
# grep "^root" pass #匹配以root開頭的行
# grep "bash$" pass #匹配以bash結尾的行
# grep -v "ftp" pass #匹配除了包含ftp的內容,其他全部列印
# grep -i "ftp" pass #忽略大小寫匹配
# grep -Ei "sync$|ftp" pass #匹配檔案中包含sync結尾或ftp字串 有-E 可以寫多個選項
# grep -n -A 2 "Failed" /var/log/secure #匹配/var/log/secure檔案中Failed字串,並列印它的下2行
# grep -n -B 2 "Failed" /var/log/secure #匹
配/var/log/secure檔案中Failed字串,並列印它的上2行
# grep -n -C 2 "Failed" /var/log/secure #匹
配/var/log/secure檔案中Failed字串,並列印它的上下2
行
2.3 檔案下載類命令
2.3.1 wget 命令
#CentOS7 系統最小化安裝預設沒有wget命令,需要進行安裝
# yum install wget -y
#下載網際網路上的檔案至本地
#wget http://mirrors.aliyun.com/repo/Centos-7.repo
#將阿里雲的centos-7.repo下載到/etc/yum.repos.d/並改名為centos-base.repo -O引數指定
#wget -O /etc/yum.repos.d/Centos-Base.repo
http://mirrors.aliyun.com/repo/Centos-7.repo
2.3.2 curl命令
#僅檢視這個url地址的檔案內容
#curl http://mirrors.aliyun.com/repo/Centos-
7.repo
#將阿里雲的centos-7.repo下載到/etc/yum.repos.d/並改
名為CentOS-Base.repo -o引數指定
# curl -o /etc/yum.repos.d/CentOS-Base.repo
http://mirrors.aliyun.com/repo/Centos-7.repo
#練習:請下載一個圖片至於/opt目錄下(不要修改名稱),最少使
用2中方式, URl地址為:
http://fj.xuliangwei.com/public/ks.jpeg
#1.wget
[root@www ~]# cd /opt
[root@www opt]# wget
http://fj.xuliangwei.com/public/ks.jpeg
[root@www ~]# wget -O /opt/ks.jpeg
http://fj.xuliangwei.com/public/ks.jpeg
#2.curl
[root@www ~]# curl -o /opt/ks2.jpeg
http://fj.xuliangwei.com/public/ks.jpeg
2.3.3 rz-sz命令
# yum install lrzsz -y #不安裝軟體則無法執行該命令
# rz #只能上傳檔案,不支援上傳資料夾,不支援大於4個G上傳,也不支援斷電續傳
#sz /path/file #只能下載檔案,不支援下載資料夾
2.4 檔案查詢類命令
2.4.1 which命令
# which ls #查詢ls命令的絕對路徑
# type -a ls #檢視命令的絕對路徑(包括別名)
2.4.2 whereis 命令
# whereis ls #查詢命令的路徑,幫助手冊,等
# whereis -b ls #僅顯示命令雖在的路徑
2.5 字元處理類命令
2.5.1 sort 命令
在有些情況下,需要對一個無序的文字進行資料的排序,這時就需要使用 sort 進行排序了
sort [OPTION]...[FILE]...
# -r :倒序 -n:按數字排序 -t :指定分隔符(預設空格)
# -k :指定第幾列,指定幾列幾字符(指定1,1 3.1,3.3)
#1.首先建立一個檔案,寫入一寫無序的內容
[root@www ~]# cat >> file.txt <<EOF
b:3
c:2
a:4
e:5
d:1
f:11
EOF
#2.使用sort下面對輸出的內容進行排序
[root@www ~]# sort file.txt
a:4
b:3
c:2
d:1
e:5
f:11
#結果並不是按照數字排序,而是按字母排序。
#可以使用-t指定分隔符, 使用-k指定需要排序的列。
[root@www ~]# sort -t ":" -k2 sort.txt
d:1
f:11 #第二行為什麼是11?不應該按照順序排列?
c:2
b:3
a:4
e:5
#按照排序的方式, 只會看到第一個字元,11的第一個字元是1,
按照字元來排序確實比2小。
#如果想要按照數字的方式進行排序, 需要使用 -n引數。
[root@www ~]# sort -t ":" -n -k2 p.txt
d:1
c:2
b:3
a:4
e:5
f:11
2.5.2 uniq命令
如果檔案中有多行完全相同的內容,當前是希望能刪除重複的行,同時還可以統計出完全相同的行的出現總次數,那麼就可以使用uniq命令解決(但是必須配合sort使用,先排序再去重)
uniq [OPTION]... [INPUT [OUTPUT]]
# 選項 : -c 計算重複的行
#1.建立一個file.txt檔案:
[root@www ~]# cat file.txt
abc
123
abc
123
#2.uniq需要和sort一起使用, 先使用sort排序, 讓重複內容
連續在一起
[root@www ~]# sort file.txt
123
123
abc
abc
#3.使用uniq去除相鄰重複的行
[root@www ~]# sort file.txt |uniq
123
abc
#4.-c引數能統計出檔案中每行內容重複的次數
[root@www ~]# sort file.txt |uniq -c
2 123
2 abc
#面試題: 請統計分析如下日誌,打印出訪問最高前10的IP
2.5.3 cut命令
cut OPTION... [FILE]...
#選項: -d 指定分隔符 -f 數字,取第幾列 -f3,6三列和6列
# -c 按字元取(空格也算)
#echo "Im xlw, is QQ 552408925" >file.txt #過
濾出檔案裡 xlw以及552408925
#實現上述題目幾種思路
# cut -d " " -f2,5 file.txt
# cut -d " " -f2,5 file.txt |sed 's#,##g'
# sed 's#,# #g' file.txt | awk -F " " '{print
$2 " " $5}'
# awk '{print $2,$5}' file.txt |awk -F ',' '{print $1,$2}'
# awk -F "[, ]" '{print $2,$6}' file.txt
# awk -F '[, ]+' '{print $2,$5}' file.txt
.2.5.4 wc命令
wc [OPTION]... [FILE]...
# 選項: -l顯示檔案行數 -c 顯示檔案位元組 -w顯示檔案單詞
# wc -l /etc/fstab #統計/etc/fstab檔案有多少行
# wc -l /etc/services #統計/etc/services 檔案行號
#練習題: 過濾出/etc/passwd以nologin結尾的內容,並統計有多少行
# 擴充套件統計檔案行號的方法
# grep -n ".*" /etc/services | tail -1
# cat -n /etc/services | tail -1
# awk '{print NR $0}' /etc/services | tail -1
2.6 課堂練習題
2.6.1 練習1
- 分析如下日誌,統計每個域名被訪問的次數.*
[root@student tmp]# cat web.log
http://www.example.com/index.html
http://www.example.com/1.html
http://post.example.com/index.html
http://mp3.example.com/index.html
http://www.example.com/3.html
http://post.example.com/2.html
# awk -F '/' '{print $3}' web.log|sort -rn|uniq –c
# cut -d / -f3 web.log|sort -rn|uniq –c
2.6.2 練習2
- 使用awk取出系統ip地址,使用多種方法實現
- 1.我要取的值在哪裡
- 2.如何縮小取值範圍(行)
- 3.如何精確具體內容(列)
2.6.4練習3
- 將/etc/sysconfig/selinux檔案中的SELINUX=enforcing替換成SELINUX=disabled
2.6.3練習4
- 將/etc/passwd檔案中的第一行中的第一列和最後一列位置進行交換
2.6.4練習5
- 現在1-100個檔案,需要保留75,76,78三個檔案,其餘全部刪除(grep,awk,sed)
03.檔案擴充套件知識
3.1 檔案屬性
- 當我們使用 ls -l 列目錄下所有檔案時,通常會以長格式
的方式顯示,其實長格式顯示就是我們 Windows 下看到的
檔案詳細資訊,我們將其稱為檔案屬性,那整個檔案的屬
性分為十列。
[root@oldxu ~]# ls -l ks.cfg
-rw-------. 1 root root 4434 May 30 13:58
ks.cfg
-rw-------. ①:第一個字元是檔案型別,其他則是許可權
1 ②:硬連結次數
root ③:檔案屬於哪個使用者
root ④:檔案屬於哪個組
4434 ⑤:檔案大小
May30 13:58 ⑥⑦⑧:最新修改的時間與日期
ks.cfg ⑨:檔案或目錄名稱
3.2 檔案型別
- 通常我們使用顏色或者字尾名稱來區分檔案型別,但很多
時候不是很準確; 字尾只是給人看的 - 所以我們可以通過 ls -l 以長格式顯示一個檔案的屬性,
通過第一列的第一個字元來近一步的判斷檔案具體的類
型。
[root@oldxu ~]# ll -d /etc/hosts /tmp /bin/ls
/dev/sda /dev/tty1 /etc/grub2.cfg /dev/log
/run/dmeventd-client
-rwxr-xr-x. 1 root root 117656 Jun 30 2016
/bin/ls
srw-rw-rw-. 1 root root 0 Jan 20 10:35
/dev/log
brw-rw----. 1 root disk 8, 0 Jan 20 10:36
/dev/sda
crw--w----. 1 root tty 4, 1 Jan 20 10:36
/dev/tty1
lrwxrwxrwx. 1 root root 22 Jan 13 11:31
/etc/grub2.cfg -> ../boot/grub2/grub.cfg
-rw-r--r--. 1 root root 199 Jan 20 11:03
/etc/hosts
drwxrwxrwt. 61 root root 8192 Jan 21 13:01
/tmp
- 檔案型別說明
- - 普通檔案(文字,二進位制壓縮,圖片,日誌等)
- d 目錄檔案
- b 裝置檔案(塊裝置)儲存裝置硬碟/dev/sda,/dev/sr0
- c 裝置檔案(字元裝置),終端/dev/tty1
- s 套接字檔案,程序與程序間的一種通訊方式(socket插座)
- l 連結檔案
- 但有些情況下,我們無法通過ls -l檔案的型別,比如: 一個
檔案,它可能是普通檔案、也可能是壓縮檔案、或者是命
令檔案等,那麼此時就需要使用file來更加精準的判斷這個
檔案的型別
[root@oldxu ~]# file /etc/hosts
/etc/hosts: ASCII text
[root@oldxu ~]# file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64,
version 1 (SYSV), dynamically linked (uses
shared libs), for GNU/Linux 2.6.32,
BuildID[sha1]=aa7ff68f13de25936a098016243ce57c3
c982e06, stripped
[root@oldxu ~]# file /dev/sda
/dev/sda: block special
[root@oldxu ~]# file /dev/tty1
/dev/tty1: character special
[root@oldxu ~]# file /etc/grub2.cfg
/etc/grub2.cfg: broken symbolic link to
`../boot/grub2/grub.cfg
[root@oldxu ~]# file /home
/home: directory
- linux副檔名不代表任何含義,僅為了我們人能更好的識別該檔案的型別
3.3 連結檔案
3.3.1 Inode與Block
檔案有檔名與資料,在Linux上被分成兩個部分:資料
data 與檔案元資料 metadata1.資料 data block ,資料塊是用來記錄檔案真實內容
的地方,我們將其稱為 Block2.元資料 metadata ,用來記錄檔案大小、建立時間、
所有者等資訊,我們將其稱為 Inode3.需要注意: Inode 不包含檔名稱, inode 僅包含文
件的元資料資訊,具體來說有以下內容:- 檔案的位元組數
- 檔案的 User ID Group ID
- 檔案的讀、寫、執行許可權
- 檔案的時間戳
- 連結數,即有多少檔名指向這個 inode
- 檔案資料 block 的位置
每個 inode 都是一個編號,作業系統是通過 Inode 來識
別不同的檔案。對於系統來說,檔名只是 inode 便於識別的別名,或者綽號。(便於我們人識別。)
表面上,使用者是通過檔名開啟的檔案,實際上系統內部這個過程分為如下三步:
- 首先,系統找到這個檔名對應的 inode 編號
- 其次,通過 inode 編號,獲取 inode 資訊
- 最後,根據 inode 資訊,找到檔案資料所在的
block ,讀出資料。
3.1.2 軟連線
什麼是軟連線:軟連結相當於 Windows 的快捷方式;
軟連結實現原理:
- 1、軟連結檔案會將 inode 指向原始檔的 block
- 2、當我們訪問這個軟連結檔案時,其實訪問的是源文
件本身;
軟連線使用場景
- 軟體升級
- 程式碼釋出
- 軟連結場景實踐
#1.準備網站1.1版本程式碼
[root@oldxu ~]# mkdir /data/rainbow-v1.1 -p
[root@oldxu ~]# echo "123" > /data/rainbow-
v1.1/index.html
#2.建立軟連結
[root@oldxu ~]# ln -s /data/rainbow-v1.1/
/data/rainbow
[root@oldxu ~]# ll /data/
drwxr-xr-x. 2 root root 6 3月 5 12:23 dir
lrwxrwxrwx. 1 root root 19 3月 10 12:09 rainbow
-> /data/rainbow-v1.1/
drwxr-xr-x. 2 root root 24 3月 10 12:09
rainbow-v1.1
#3.檢查網站程式
[root@oldxu ~]# cat /data/rainbow/index.html
123
#4.新更新一個網站的程式程式碼
[root@oldxu ~]# mkdir /data/rainbow-v1.2
[root@oldxu ~]# echo "456" > /data/rainbow-
v1.2/index.html
#5.升級
[root@oldxu ~]# rm -f /data/rainbow && ln -s
/data/rainbow-v1.2/ /data/rainbow
[root@oldxu ~]# cat /data/rainbow/index.html
456
#6.回退
[root@oldxu ~]# rm -f /data/rainbow && ln -s
/data/rainbow-v1.1/ /data/rainbow
[root@oldxu ~]# cat /data/rainbow/index.html
123
3.1.3 硬連結
硬連結類似於超時有多個門,無論叢哪個門進入,看到的
內容都是一樣的。不會影響進入超市回到系統中,我們對硬連結的解釋: 不同的檔名指向同一
個 inode ,簡單的說就是指向同一個真實的資料來源。
硬連結與軟連結區別
- 1)ln命令建立硬連結,ln -s命令建立軟連結
- 2)目錄不能建立硬連結,並且硬連結不可以跨越分割槽
系統; - 3)軟連結支援對目錄建立,同時也支援跨越分割槽系
統; - 4)硬連結檔案與原始檔的inode相同,軟連結檔案與源
檔案inode不同 - 5)刪除軟連結檔案,對原始檔及硬連結檔案無任何影
響; - 6)刪除檔案的硬連結檔案,對原始檔及連結檔案無任
何影響; - 7)刪除連結檔案的原始檔,對硬連結無影響,會導致
軟連結失效; - 8)刪除原始檔及其硬連結檔案,整個檔案會被真正的
刪除;
3.4 檔案時間[擴充套件]
- linux 下檔案有3個時間的,分別是 atime,mtime,ctime
硬連結與軟連結區別
- 1)ln命令建立硬連結,ln -s命令建立軟連結
- 2)目錄不能建立硬連結,並且硬連結不可以跨越分割槽
系統; - 3)軟連結支援對目錄建立,同時也支援跨越分割槽系
統; - 4)硬連結檔案與原始檔的inode相同,軟連結檔案與源
檔案inode不同 - 5)刪除軟連結檔案,對原始檔及硬連結檔案無任何影
響; - 6)刪除檔案的硬連結檔案,對原始檔及連結檔案無任
何影響; - 7)刪除連結檔案的原始檔,對硬連結無影響,會導致
軟連結失效; - 8)刪除原始檔及其硬連結檔案,整個檔案會被真正的
刪除;
3.4 檔案時間[擴充套件]
- linux 下檔案有3個時間的,分別是 atime,mtime,ctime
硬連結與軟連結區別
- 1)ln命令建立硬連結,ln -s命令建立軟連結
- 2)目錄不能建立硬連結,並且硬連結不可以跨越分割槽
系統; - 3)軟連結支援對目錄建立,同時也支援跨越分割槽系
統; - 4)硬連結檔案與原始檔的inode相同,軟連結檔案與源
檔案inode不同 - 5)刪除軟連結檔案,對原始檔及硬連結檔案無任何影
響; - 6)刪除檔案的硬連結檔案,對原始檔及連結檔案無任
何影響; - 7)刪除連結檔案的原始檔,對硬連結無影響,會導致
軟連結失效; - 8)刪除原始檔及其硬連結檔案,整個檔案會被真正的
刪除;
3.4 檔案時間[擴充套件]
- linux 下檔案有3個時間的,分別是 atime,mtime,ctime
- atime 訪問時間 檔案中的資料最後被訪問的時間
- mtime 修改時間 檔案內容被修改的最後時間
- ctime 變化時間 檔案的元資料發生變化。比如許可權,所有者等
3.4.1 環境準備
- 通過 stat 來檢視時間
[root@oldxu ~]# mount -o remount,strictatime /
[root@oldxu ~]# echo "hello boy" >> new_file
[root@oldxu ~]# stat new_file
File: 'new_file'
Size: 10 Blocks: 8 IO
Block: 4096 regular file
Device: fd00h/64768d Inode: 34724341
Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/
root) Gid: ( 0/ root)
Access: 2021-07-07 16:24:02.320233640 +0800
Modify: 2021-07-07 16:24:02.320233640 +0800
Change: 2021-07-07 16:24:02.320233640 +0800
Birth: -
3.4.2 atime
[root@oldxu ~]# cat new_file
hello boy
[root@oldxu ~]# stat new_file
File: 'new_file'
Size: 10 Blocks: 8 IO
Block: 4096 regular file
Device: fd00h/64768d Inode: 34724341
Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/
root) Gid: ( 0/ root)
Access: 2021-07-07 16:24:56.362408139 +0800
# 訪問時間發生變化
Modify: 2021-07-07 16:24:02.320233640 +0800
Change: 2021-07-07 16:24:02.320233640 +0800
Birth: -
3.4.2 mtime
# 寫入資料
[root@oldxu ~]# echo "Hello" >> new_file
[root@oldxu ~]# stat new_file
File: 'new_file'
Size: 16 Blocks: 8 IO
Block: 4096 regular file
Device: fd00h/64768d Inode: 34724341
Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/
root) Gid: ( 0/ root)
Access: 2021-07-07 16:28:35.520036828 +0800
Modify: 2021-07-07 16:32:36.806358744 +0800 # 內
容被修改後,mtime會變化
Change: 2021-07-07 16:32:36.806358744 +0800 # 變
化
Birth: -
# ctime時間發生變化的原因是,內容變化了,innode所記錄的
大小也需要變化,所以時間發生了變化
3.4.3 ctime
# 修改檔案屬性
[root@oldxu ~]# chown adm new_file
[root@oldxu ~]# stat new_file
File: 'new_file'
Size: 16 Blocks: 8 IO
Block: 4096 regular file
Device: fd00h/64768d Inode: 34724341
Links: 1
Access: (0644/-rw-r--r--) Uid: ( 3/
adm) Gid: ( 0/ root)
Access: 2021-07-07 16:28:35.520036828 +0800
Modify: 2021-07-07 16:32:36.806358744 +0800
Change: 2021-07-07 16:36:03.441728857 +0800 # 只
有ctime變化