Linux管道符

Linux小菜鸟發表於2024-07-03

十五、管道符

管道符和grep命令結合的是最多的
管道符的標準定義:
管道是一種通訊機制,常用語程序之間的通訊。它表現出來的形式:將前一個的標準輸出(stdout)作為後面命令的標準輸入(stdin)

image-20231121234901537

利用grep和管道符來檢視使用者資訊

使用者資訊儲存在 /etc/passwd中
我們自己建立的使用者的ID號從1000開始
zwj:x:1002:1003::/home/zwj:/bin/bash
透過grep命令可以確定使用者是不是存在
grep username /etc/passwd

比方說我想要查詢xuruizhao使用者的資訊
有兩種方法
1、不用管道符
grep username /etc/passwd
2、用管道符
[root@bogon ~]# cat /etc/passwd | grep 'xuruizhao' 
xuruizhao:x:1001:1001::/home/xuruizhao:/bin/bash

管道符結合find命令搜尋資訊
找出系統中所有的.txt的檔案,找到在/home目錄下的檔案
[root@bogon ~]# find / -name '*.txt'  ### 找到根目錄下所有的txt檔案
[root@bogon ~]# find / -name '*.txt' | grep '/home' ###  在、home目錄下有哪些txt的檔案
有一個問題:我們透過find命令找到的僅僅是一行行的文字,並不是把檔案篩選出來了,也可以理解為是篩選出了檔名,並不是檔案,我們不可以透過find命令找到的檔名去對對應的檔案進行檔案操作
[root@bogon opt]# find / -name '*.txt' | grep 'apple'  ## 這個命令是過濾出檔名中含有apple的.txt檔案,並不是檔案內容中含有apple的檔案,因為我們不可以對透過find命令查詢出的檔名對檔案進行操作,我們只可以對find所找到的文字(檔名)進行操作
那麼我們如何可以透過find命令去對檔案的內容進行過濾,我們需要使用到xargs命令
grep的引數
1、-n  顯示對應內容存在的行號
[root@localhost opt]# grep -n 'apple' ./a*
./a1:4:apple
./a2:1:apple
./a3:1:apple
2、-i  在查詢內容時忽略大小寫
[root@localhost opt]# grep -n -i  'apple' ./a*
./a1:2:APple
./a1:4:apple
./a2:1:apple
./a3:1:apple

【1】使用管道符來檢視程序

ps -ef 是檢視系統中所有的程序,我們可以將得到的所有的程序寫入一個新檔案中,再去透過grep和管道符進行篩選
如果系統中不存在這個程序,使用
ps -ef | grep 所需要查的程序  命令,如下圖的結果,這並不是對應程式的程序,而是grep在使用時產生的臨時程序,輸出結果的第二個數字是程序的ID號,臨時程序的ID號在每一次建立時是會不斷髮生變化的,由此可以判斷出這是一個臨時程序。
[root@localhost opt]# cat new.txt | grep -n 'root'
這樣即可檢視出想要查詢的程式了

image-20231124090910790

【2】檢視系統的埠

需要學習檢視系統埠的命令,和ps -ef 一樣,都是檢視某一種系統資源的
netstat -tunlp ###  這個組合引數是檢視系統上所有的埠資訊
[root@localhost opt]# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1490/master         
tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN      1351/sshd: root@pts 
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      634/rpcbind         
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      1581/dnsmasq        
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1126/sshd           
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      1128/cupsd          
tcp6       0      0 ::1:25                  :::*                    LISTEN      1490/master         
tcp6       0      0 ::1:6010                :::*                    LISTEN      1351/sshd: root@pts 
tcp6       0      0 :::111                  :::*                    LISTEN      634/rpcbind         
tcp6       0      0 :::22                   :::*                    LISTEN      1126/sshd           
tcp6       0      0 ::1:631                 :::*                    LISTEN      1128/cupsd          
。。。。。

image-20231124095030306

【3】檢查檔案個數

比如檢查/var/log 中log檔案的個數

[root@localhost opt]# find /var/log -name '*.log' | wc -l 
40

判斷出系統中用多少個txt檔案
[root@localhost opt]# find /  -name '*.txt' | wc -l 
1207

統計系統的統計使用者數量
[root@localhost opt]# cat /etc/passwd | wc -l
46

【4】、管道符和xargs結合使用

將前一個命令得到結果透過管道符傳遞給xargs命令進行二次加工,xargs的二次加工是真正意義上的二次加工,而不是對前一個命令得到的結果的文字進行處理,而是對文字所對行的檔案進行處理。
xargs可以與find命令、ls命令等進行搭配使用。

-i 引數:可以使用{}來表示前一個命令得到的結果(檔案)

1、透過xargs對檔案進行批次備份

我們對/opt目錄下的.txt檔案進行備份
[root@bogon opt]# find /opt -name '*.txt' | xargs -i cp {} {}.apk
### 將find得到的結果傳遞給xargs 進行重新命名操作,{}代表find得到的檔案內容
[root@bogon opt]# ll
total 60
-rw-r--r--. 1 root root   159 Nov  9 14:52 1
-rw-r--r--. 1 root root     0 Nov 27 14:14 10.txt
-rw-r--r--. 1 root root     0 Nov 27 14:16 10.txt.apk
-rw-r--r--. 1 root root     0 Nov 27 14:14 1.txt
-rw-r--r--. 1 root root     0 Nov 27 14:16 1.txt.apk
-rw-r--r--. 1 root root     0 Nov 27 14:14 2.txt
-rw-r--r--. 1 root root     0 Nov 27 14:16 2.txt.apk
-rw-r--r--. 1 root root     0 Nov 27 14:14 3.txt
-rw-r--r--. 1 root root     0 Nov 27 14:16 3.txt.apk
-rw-r--r--. 1 root root     0 Nov 27 14:14 4.txt
-rw-r--r--. 1 root root     0 Nov 27 14:16 4.txt.apk
-rw-r--r--. 1 root root     0 Nov 27 14:14 5.txt
-rw-r--r--. 1 root root     0 Nov 27 14:16 5.txt.apk
-rw-r--r--. 1 root root     0 Nov 27 14:14 6.txt
-rw-r--r--. 1 root root     0 Nov 27 14:16 6.txt.apk
。。。

2、透過xargs對檔案進行重新命名

將/opt目錄下的。txt檔案改為.log檔案
[root@bogon opt]# find /opt -name '*.txt' | xargs rename .txt .log {}
[root@bogon opt]# ll
total 8
-rw-r--r--. 1 root root   0 Nov 27 14:37 10.log
-rw-r--r--. 1 root root   0 Nov 27 14:37 1.log
-rw-r--r--. 1 root root   0 Nov 27 14:37 2.log
-rw-r--r--. 1 root root   0 Nov 27 14:37 3.log
-rw-r--r--. 1 root root   0 Nov 27 14:37 4.log
-rw-r--r--. 1 root root   0 Nov 27 14:37 5.log
-rw-r--r--. 1 root root   0 Nov 27 14:37 6.log
-rw-r--r--. 1 root root   0 Nov 27 14:37 7.log
-rw-r--r--. 1 root root   0 Nov 27 14:37 8.log
-rw-r--r--. 1 root root   0 Nov 27 14:37 9.log
-rw-r--r--. 1 root root  91 Nov 17 22:44 gushishi
drwxr-xr-x. 2 root root  51 Nov 27 14:38 he
-rw-r--r--. 1 root root 269 Nov  9 17:09 practice.tar.gz
drwxr-xr-x. 2 root root   6 Sep 10 16:18 rh
rename命令是重新命名命令,
語法:rename 原字串 新字串 作用物件

3、查詢系統中的txt檔案中哪些存在apple內容

[root@bogon opt]# find /   -type f -name '*.txt' | xargs -i  grep -l 'apple' {}
grep的-l引數:顯示出這個內容在哪一個檔案中

【5】、grep命令

1、grep 關鍵字 filename

[root@bogon opt]# grep '有' gushi.txt 
借問酒家何處有

2、-n

顯示行號
[root@bogon opt]# grep -n '有' gushi.txt ###  顯示行號
5:借問酒家何處有
grep 不僅僅可以從檔案中搜尋資料,只要是文字他就可以進行搜尋

3、grep從多個檔案中搜尋過濾

[root@bogon opt]# grep 'apple' ./*  ### grep是不可查目錄的
./a:apple
./a1:apple
./a2:apple
./a3:apple
grep: ./abc: Is a directory
grep: ./he: Is a directory
grep: ./rh: Is a directory

4、 -i

[root@bogon opt]# grep -i 'apple' ./*
./a:apple
./a1:APple
./a2:apple
./a3:apple
grep: ./abc: Is a directory
grep: ./he: Is a directory
grep: ./rh: Is a directory

5、-R

遞迴查詢
[root@bogon opt]# grep -Rn 'passwd' /var/log

6、-v引數

反向過濾
[root@bogon opt]# df -Th | grep -v tmp
Filesystem            Type      Size  Used Avail Use% Mounted on
/dev/mapper/rhel-root xfs        37G   20G   18G  52% /
/dev/mapper/rhel-home xfs        19G  162M   18G   1% /home
/dev/nvme0n2p2        xfs       495M   29M  466M   6% /mnt/xfs
/dev/sr0              iso9660    13G   13G     0 100% /mnt/cdrom
/dev/nvme0n2p1        ext4      189M   14K  175M   1% /mnt/ext
/dev/nvme0n1p1        xfs      1014M  198M  817M  20% /boot

7、grep和正則結合使用

*表示以什麼開頭
$表示以什麼結尾
^$表示空行

相關文章