文章目錄
- Linux管道符
- 命令格式
- 實戰
- 正則運算式
- 實戰
- 找出所有的hello單詞
- 找出hello單詞后面有world單詞
- 以0開頭然后是兩個數字然后是一個連字符-,最后是8個數字
- 匹配以字符h開頭的單詞
- 匹配剛好6個字符的單詞
- 匹配一個或更多連接的數字
- 匹配5-12位的QQ號
- grep
- 定義
- 格式
- 實戰
- 查找檔案內容包含h的行數
- 查找檔案內容不包含h的行數
- 查找以n開頭的行
- 查找以k結尾的行
- sed
- 定義
- 語法
- 查看幫助
- 操作
- 新增
- 取代(c)
- 洗掉
- 插入
- 列印
- 取代(s)
- 直接修改檔案內容
- awk
- 定義
- 命令形式
- 常用引數
- 實戰
- 搜索/etc/passwd/有root關鍵字的所有行,并顯示對應的shell
- 列印/etc/passwd的第二行資訊
- 使用begin加入標題
- 自定義分隔符
Linux管道符
命令格式
命令1的正確輸出作為命令2的操作物件
[root@web1 Test]#命令1 | 命令2
實戰
創建一個文本檔案,輸入任意內容
[root@web1 Test]# touch test.txt
[root@web1 Test]# vim test.txt
hello world
how are you?
i am fine,thanks
nice to meet you
good luck
查看在test.txt中包含hello的行
[root@web1 Test]# cat test.txt | grep "hello"
hello world
[root@web1 Test]#
查看在test.txt中包含h的行
[root@web1 Test]# cat test.txt | grep "h"
hello world
how are you?
i am fine,thanks
[root@web1 Test]#
當然,還可以有其他操作,比如
[root@web1 Test]# su xwk
[xwk@web1 Test]$ ping 127.0.0.1|whoami
xwk
[xwk@web1 Test]$ su
密碼:
[root@web1 Test]# ping 127.0.0.1|whoami
root
[root@web1 Test]#
正則運算式
| 常用的元字符 | |
|---|---|
| . (點號) | 匹配除換行符以外的任意字符 |
| \w | 匹配字母、數字、下劃線或漢字 |
| \s | 匹配任意的空白符 |
| \d | 匹配數字 |
| \b | 匹配單詞的開始或結束 |
| ^ | 匹配字串的開始 |
| $ | 匹配字串的結束 |
| 常用的限定符 | |
|---|---|
| * | 重復零次或更多次 |
| + | 重復一次或更多次 |
| ? | 重復零次或一次 |
| {n} | 重復n次 |
| {n,} | 重復n次或更多次 |
| {n,m} | 重復n到m次 |
實戰
推薦一個網站,可以在線進行正則運算式測驗
https://tool.oschina.net/regex
找出所有的hello單詞
\bhello\b

找出hello單詞后面有world單詞
\bhello\b.*\bworld\b

以0開頭然后是兩個數字然后是一個連字符-,最后是8個數字
0\d{2}-\d{8}

匹配以字符h開頭的單詞
\bh\w*\b

匹配剛好6個字符的單詞
\b\w{6}\b

匹配一個或更多連接的數字
\d+

匹配5-12位的QQ號
\d{5,12}

弊端,前后加字母依然可以匹配到,如

改進
^\d{5,12}$

目前這個匹配只能輸入一條,輸入多條就會連正確的也匹配不到,不知道為什么


grep
定義
根據用戶指定的模式對目標文本進行過濾,顯示被匹配到的行,
格式
grep [OPTIONS] PATTERN [FILE]
| 符號 | 說明 |
|---|---|
| -v | 顯示不被pattern匹配到的行 |
| -i | 忽略字符大小寫 |
| -n | 顯示匹配的行號 |
| -c | 統計匹配的字數 |
| -o | 僅顯示匹配到的字串 |
| -E | 使用ERE,相當于egrep |
實戰
查找檔案內容包含h的行數
[root@web1 Test]# grep -n h test.txt
1:hello world
2:how are you?
3:i am fine,thanks
[root@web1 Test]#
查找檔案內容不包含h的行數
[root@web1 Test]# grep -nv h test.txt
4:nice to meet you
5:good luck
[root@web1 Test]#
查找以n開頭的行
[root@web1 Test]# grep -n ^n test.txt
4:nice to meet you
[root@web1 Test]#
查找以k結尾的行
[root@web1 Test]# grep -n k$ test.txt
5:good luck
[root@web1 Test]#
sed
定義
sed是流編輯器,一次處理一行內容

語法
sed [-hnV][-e<script>][-f<script檔案>][文本檔案]
| 符號 | 說明 |
|---|---|
| a | 新增 |
| c | 取代(c的后面可以接字串,這些字串可以取代n1,n2之間的行) |
| d | 洗掉 |
| i | 插入 |
| p | 列印 |
| s | 取代(直接進行取代作業) |
查看幫助
man sed 或 sed -h
操作
以下操作僅回傳改變結果,不直接更改原檔案里的內容,除非vim編輯,否則test.txt內容不變,
新增
在第4行的下一行(第5行)新增add_to_4
[root@web1 Test]# sed -e '4 a add_to_4' test.txt
hello world
how are you?
i am fine,thanks
nice to meet you
add_to_4
good luck
[root@web1 Test]#
取代(c)
將原本的1-3行內容用hi取代
[root@web1 Test]# sed -e '1,3c hi' test.txt
hi
nice to meet you
good luck
[root@web1 Test]#
洗掉
洗掉檔案1-2行
[root@web1 Test]# sed -e '1,2d' test.txt
i am fine,thanks
nice to meet you
good luck
[root@web1 Test]#
插入
第二行插入insert_to_2
[root@web1 Test]# sed -e '2i insert_to_2' test.txt
hello world
insert_to_2
how are you?
i am fine,thanks
nice to meet you
good luck
[root@web1 Test]#
列印
列印存在h的行
[root@web1 Test]# sed -n '/h/p' test.txt
hello world
how are you?
i am fine,thanks
[root@web1 Test]#
取代(s)
為了更容易理解,我們重新編輯一下test.txt文本
[root@web1 Test]# cat test.txt
hello world
hello hello hello
hello
how are you?
i am fine,thanks
nice to meet you
good luck
[root@web1 Test]#
觀察兩條命令回傳結果的不同之處,加g與不加g有什么區別?
[root@web1 Test]# sed -e 's/hello/hi/' test.txt
hi world
hi hello hello
hi
how are you?
i am fine,thanks
nice to meet you
good luck
[root@web1 Test]# sed -e 's/hello/hi/g' test.txt
hi world
hi hi hi
hi
how are you?
i am fine,thanks
nice to meet you
good luck
[root@web1 Test]#
下面改變檔案內容
直接修改檔案內容
修改前檔案內容
[root@web1 Test]# cat test.txt
hello world
hello hello hello
hello
how are you?
i am fine,thanks
nice to meet you
good luck
[root@web1 Test]#
檔案修改后
[root@web1 Test]# sed -i 's/hello/hi/g' test.txt
[root@web1 Test]# cat test.txt
hi world
hi hi hi
hi
how are you?
i am fine,thanks
nice to meet you
good luck
[root@web1 Test]#
awk
定義
把檔案逐行的讀入,以空格為默認分隔符將每行切片,切開的部分再進行后續處理,
命令形式
awk 'pattern+action'[FILE]
常用引數
| 引數 | 說明 |
|---|---|
| FILENAME awk | 瀏覽的檔案名 |
| BEGIN | 處理文本之前要執行的操作 |
| END | 處理文本之后要執行的操作 |
| FS | 設定輸入域分隔符,等價于命令列-F選項 |
| NF | 瀏覽記錄的域的個數(列數) |
| NR | 已讀的記錄數(行數) |
| OFS | 輸出域分隔符 |
| ORS | 輸出記錄分隔符 |
| RS | 控制記錄分隔符 |
| $0 | 整條記錄 |
| $1 | 表示當前行的第一個域,以此類推 |
實戰
搜索/etc/passwd/有root關鍵字的所有行,并顯示對應的shell
[root@web1 Test]# awk -F: '/root/{print $7}' /etc/passwd
/bin/bash
/sbin/nologin
/sbin/nologin
[root@web1 Test]#
列印/etc/passwd的第二行資訊
[root@web1 Test]# awk -F: 'NR==2{print $0}' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
[root@web1 Test]#
使用begin加入標題
[root@web1 Test]# awk -F: 'BEGIN{print "BEGIN BEGIN"} {print $1,$2}' /etc/passwd
自定義分隔符
[root@web1 Test]# echo "111 222|333 444|555 666"
111 222|333 444|555 666
[root@web1 Test]# echo "111 222|333 444|555 666"|awk 'BEGIN{RS="|"}{print $0}'
111 222
333 444
555 666
[root@web1 Test]#
呼——終于寫完了,熟能生巧,這些命令還是要多練一練,
最好能像回答1+1=2一樣,別人問你,你張口就能回答出來(手動滑稽,手動狗頭保命)嘿嘿~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/301757.html
標籤:其他
上一篇:H3C License授權之實戰
