1. 程式人生 > 其它 >檔案的高階命令-檔案處理三劍客

檔案的高階命令-檔案處理三劍客

檔案的高階命令

昨天的vim的補充

在螢幕中游標快速移動
   H: 游標移動到這個螢幕的最上方那一行的第一個字元
   M: 游標移動到這個螢幕的中央那一行的第一個字元
   L: 游標移動到這個螢幕的最下面一行的第一個字元
    
查詢替換
    語法格式:   : 行數 s/被替換字元/替換字元/
   :1,3 s/egon/Egon/      # 把1到3行的第一個egon替換成Egon
   :5,$ s/egon/EGON/g     # 把第五行到最後一行的所有egon換成EGON, 後面的g是全域性的意思
   :% s/egon/EGON/g       # %代表全文的意思,把全文的egon替換成EGON
   :% s/^#//              # 第一個雙斜槓裡面可以是正則表示式^表示以什麼開頭,這段程式碼意思是將全文以#開頭的替換成空 
    
讀入寫入檔案
   :w /aaa.txt            # 另存為根目錄下的aaa.txt
   :1,3 w /2.txt          # 將1到3行另存到根下的2.txt
   :r /ect/hosts          # 將/ect/hosts的內容讀到當前檔案

設定環境
   :set nu                # 設定行號
   :set ic                # 不區分大小寫
   :set ai                # 自動縮排
   :set nonu              # 取消設定行號
   :set noic              # 取消區分大小寫

同時編輯多個檔案
   vim -o /home/qwe/1.txt  /ect/hosts
       同時編輯這兩個檔案,按ctrl+w+w 切換,,儲存退出需要執行兩次,小o是水平分割,大O是垂直分割
   vimdiff /home/qwe/1.txt /etc/host
       對比檔案,按ctrl+w+w 切換,儲存退出需要執行兩次,不同的內容高亮顯示
   
用echo往檔案中新增內容
    [root@localhost ~]# echo '123' >> /home/qwe/2.txt
    [root@localhost ~]# cat /home/qwe/2.txt 
    123

可視塊操作:
    按ctrl+v進入即可
    在這個頁面可以通過方向鍵選中內容,進行一個增刪改查的操作
"""
檔案在修改的時候,系統會從硬碟拿出一部分空間來存放你臨時修改的檔案,以.開頭.swp結尾的檔案,所以如果檔案在沒有儲存的情況下關閉是不會有事的,是可以找的回來的,但是要是這個臨時檔案,沒了,那就是真的沒了。
"""

檔案處理命令三劍客之sed

流式編輯器,主要擅長對檔案的編輯操作。
語法格式:
  sed -選項(一般都是r) '定位 + 命令' 檔案路徑
    選項:
       -n  取消預設輸出
       -r  支援擴充套件正則元字元
       -i  立即編輯檔案
    定位:
        行定位: n代表定位到n行;  n,m表示從第n行到第m行;  不寫代表所有行
        正則定位: 
            /^str/ 以str開頭的一行; 
            /str$/ 以str結尾的一行;
            /str/  包含str的行;
    命令:
       p: 列印定位的那一行,原本的這一行也會輸出。
       d: 刪除得的這一行。
       c:  改變這一行。
       s: 替換這一行。
    
行定位:
[root@localhost ~]# sed -r '' /home/qwe/1.txt 
111
egon222
33egon3egon3333egon
444                        # ''不寫預設就是全部列印
egon55egon5egon
666
777egon
[root@localhost ~]# sed -r '2p' /home/qwe/1.txt 
111
egon222
egon222                    # 對第二行多列印一次
33egon3egon3333egon
444
egon55egon5egon
666
777egon
[root@localhost ~]# sed -r '2d' /home/qwe/1.txt 
111
33egon3egon3333egon
444                       # 刪除第二行
egon55egon5egon
666
777egon
[root@localhost ~]# sed -r '3c xxxx' /home/qwe/1.txt 
111
egon222
xxxx                             # 把第三行全部替換成xxxx
444 
egon55egon5egon
666
777egon
[root@localhost ~]# sed -r '5s/egon/EGON/g' /home/qwe/1.txt 
111
egon222
33egon3egon3333egon
444
EGON55EGON5EGON                  # 把第五行的小寫egon全部替換成大寫EGON
666
777egon
[root@localhost ~]# 
'''=================================================================================='''
正則定位:
[root@localhost ~]# sed -r '' /home/qwe/1.txt 
111
egon222                        #
33egon3egon3333egon            
444
egon55egon5egon
666
777egon
[root@localhost ~]# sed -r '/^egon/d' /home/qwe/1.txt 
111
33egon3egon3333egon             # 刪除以egon開頭的所有行
444
666
777egon
[root@localhost ~]# sed -r '/egon$/c xxxx' /home/qwe/1.txt 
111
egon222
xxxx                             # 將以egon結束的所有行替換成 xxxx
444
xxxx
666
xxxx
[root@localhost ~]# sed -r '/egon/s/egon/EGON/g' /home/qwe/1.txt 
111
EGON222
33EGON3EGON3333EGON              # 將包含egon的行裡面的所有egon替換成EGON
444
EGON55EGON5EGON
666
777EGON
[root@localhost ~]# 


# 修改檔案內容,在r後面加一個i就可以修改,前提是確定要修改之後在修改
[root@localhost ~]# sed -ri '/egon/s/egon/EGON/g' /home/qwe/1.txt 
[root@localhost ~]# cat /home/qwe/1.txt 
111
EGON222
33EGON3EGON3333EGON
444
EGON55EGON5EGON
666
777EGON
[root@localhost ~]# 


ps:
   替換後面的g後面可以根一個i,表示大小寫不在意

檔案處理三劍客之awk

語法格式:
   awk -F指定分隔符 '指定行{print 第幾列}' 檔案路徑
    
    NR: 記錄號
    NF: 以-F分割符分割的段數
指定行:
   比較運算:
        NR >= 3 && NR <=5   表示從第三行到第五行
        NR <= 3 || NR >=4   表示小於等於三的行數和大於等於五的行數
   正則表示式
        /^str/ 以str開頭的一行; 
        /str$/ 以str結尾的一行;
        /str/  包含str的行;
        
 [root@localhost ~]# cat -n /home/qwe/1.txt 
     1	t:x:0:0:root:/root:/bin/bash
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     3	daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4	adm:x:3:4:adm:/var/adm:/sbin/nologin
     5	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6	sync:x:5:0:sync:/sbin:/bin/sync
     7	shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8	halt:x:7:0:halt:/sbin:/sbin/halt
     9	mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10	operator:x:11:0:operator:/root:/sbin/nologin
    11	games:x:12:100:games:/usr/games:/sbin/nologin
    12	ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@localhost ~]# awk -F: 'NR >=3 && NR <=7{print $1,$3}' /home/qwe/1.txt 
daemon 2                # 以:分割,找到行數大於等於3 並且 小於等於7 然後打印出每一行第一列和第三列,中間逗號代                                    表空格
adm 3
lp 4
sync 5
shutdown 6
[root@localhost ~]# awk -F: 'NR <=2 || NR >= 11{print $1">>>"$NF}' /home/qwe/1.txt 
# 以:分割,找到小於等於2並且大於等於11,然後打印出第一列和最後一列,中間用>>>連線
t>>>/bin/bash
bin>>>/sbin/nologin   
games>>>/sbin/nologin
ftp>>>/sbin/nologin
[root@localhost ~]# awk -F: '/bash$/{print $1,$NF}' /home/qwe/1.txt 
# 找到以bash結尾的一行,然後打印出第一列和最後一列
t /bin/bash


'''
行數不寫,預設所有文字

'''

檔案處理三劍客之grep

語法:
   grep 選項 '正則' 檔案路徑
選項:
    -n: 再過濾出來的每一行前面加上它在檔案中的相對行號
    -i:  忽略大小寫
    -R, -r:  遞迴
    -l:  如果匹配不成功,則只將檔名打印出來,失敗則不列印,通常-rl一起用

[root@localhost ~]# grep -n 'root' /etc/passwd
# 過濾出包含root的行,
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# grep -n '^root' /etc/passwd
# 過濾出以root開頭的行
1:root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# grep -n 'root$' /etc/passwd
[root@localhost ~]# grep -l 'root$' /etc/passwd
[root@localhost ~]# grep -n 'bash$' /etc/passwd
# 過濾以bash結尾的行
1:root:x:0:0:root:/root:/bin/bash
21:lyh:x:1000:1000:lyh:/home/lyh:/bin/bash
27:qwe:x:1001:1001::/home/qwe:/bin/bash
28:asd:x:1002:1002::/home/asd:/bin/bash
[root@localhost ~]# 

[root@localhost ~]# grep -rl 'ip' /boot/grub2/locale/
# 遞迴過濾,/boot/grub2/locale/這個資料夾下面含有ip的檔名
/boot/grub2/locale/ast.mo
/boot/grub2/locale/ca.mo
/boot/grub2/locale/da.mo
/boot/grub2/locale/de.mo
/boot/grub2/locale/[email protected]
/boot/grub2/locale/de_CH.mo
.................
[root@localhost ~]# 

[root@localhost ~]# ps aux | grep bash
root       1660  0.0  0.3 116732  3208 tty1     Ss+  14:35   0:00 -bash
root       2300  0.0  0.3 116832  3488 pts/1    Ss   16:00   0:00 -bash
root       2576  0.0  0.0 112824   968 pts/1    R+   16:49   0:00 grep --color=auto bash

'''
三劍客命令都支援管道
'''