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 與檔案元資料 metadata

    • 1.資料 data block ,資料塊是用來記錄檔案真實內容

      的地方,我們將其稱為 Block

    • 2.元資料 metadata ,用來記錄檔案大小、建立時間、

      所有者等資訊,我們將其稱為 Inode

    • 3.需要注意: 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變化