grep-sed命令用法:
阿新 • • 發佈:2018-11-23
使用者切換
su username:非登入式切換
su - username:登入式切換
su -l username:登入式切換
su username -c COMMAND
echo -n
-e \n
\t
‘\033[31-7mXXXXXXXXXX\033[0m’
‘\033[41-7mXXXXXXXXXX\033[0m’
‘\033[31;42mXXXXXXXXX\033[0m’
‘\033[1-7mXXXXXXXXXXX\033[0m’
3X為前景色;4X為背景色
'\033[20Ghello'空20個字元再顯示。
\033程式碼也可用\e代替:echo -e "\e[31;5mhello,world\e[0m"閃爍效果
date +%s 從1970/1/1 零時零分到現在共經歷了多少秒。
date +%F
date +%T
+%D
******************************
***********************************
文字處理工具之grep、egrep和fgrep:
grep: (global search regular expression(RE) and print out the line
文字搜尋工具,根據使用者指定的文字模式對目標檔案進行逐行搜尋,顯示能夠被模式所匹配到的行
格式:grep [options] 'PATTERN' file,...
--color=auto
正則表示式:
1)基本正則表示式BRE
2)擴充套件正則表示式ERE
正則表示式模式都區分大小寫,空格也是字元
正則表示式識別的特殊字元包括
.*[]^${}\+?|()
如果^放在模式中的其他位置而不是開頭,^就是普通字元
正則表示式:是一類字元所書寫出的模式(pattern)
元字元:不表示字元本身的意義,用於額外功能性的描述
基本正則表示式和擴充套件正則表示式
基本正則表式的元字元:
字元匹配:
.: 任意單個字元
[]: 指定範圍內的任意單個字元
[0-9], [[:digit:]]
[a-z], [[:lower:]]
[A-Z], [[:upper:]]
[[:alpha:]]所有大小寫字母
[[:alnum:]]包含數字和字母表
[[:space:]]匹配空白字元
[[:punct:]]標點符號
[^]:指定範圍外的任意單個字元
次數匹配:用來指定匹配其前面的字元的次數
*: 任意次
例子:x*y, xxy, xy, y,
.*: 匹配任意長度的任意字元
\?: 0次或1次
x\?y, xy, y, xxy
貪婪模式:儘可能的長的去匹配字元;
\{m\}: 匹配m次
\{m,n\}:
\{m,\}: 至少m次;
\{0,n\}:至多n次;
位置錨定:用於指定字元出現的位置
^: 錨定行首
^Char
$: 錨定行尾
char$
^$: 空白行
\<char: 錨定詞首,\bchar
char\>: 錨定詞尾,char\b
分組:
\(\)
\(ab\)*xy
引用:
\1: 後向引用,引用前面的第一個左括號以及與之對應的右括號中的模式所匹配到的內容
\2
...
\(a.b\)xy\1: a6bxya6b,
He like his lover.
She love her liker.
He love his lover.
She like her liker.
grep 常用選項:
-v: 反向,顯示不能被模式所匹配到的行;
-o: 僅顯示被模式匹配到的字串,而非整行;
-i: 不區分字元大小寫, ignore-case
-E: 支援擴充套件的正則表示式
-A #:顯示匹配行及下面的#行
-B #
-C # 顯示匹配行及上下各#行
-c:統計匹配行數
-w:指定要搜尋的單詞
-n: 在輸出的每行前加上它所在的檔案中它的行號
-e:指定多個匹配模式
練習:
1、顯示/proc/meminfo檔案中以大小寫s開頭的行;
# grep "^[sS]" /proc/meminfo
# grep -i "^s" /proc/meminfo
2、取出預設shell為非bash的使用者;
# grep -v "bash$" /etc/passwd | cut -d: -f1
3、取出預設shell為bash的且其ID號最大的使用者;
# grep "bash$" /etc/passwd | sort -n -t: -k3 | tail -1 | cut -d: -f1
4、顯示/etc/rc.d/rc.sysinit檔案中,以#開頭,後面跟至少一個空白字元,而後又有至少一個非空白字元的行;
# grep "^#[[:space:]]\{1,\}[^[:space:]]\{1,\}" /etc/rc.d/rc.sysinit
5、顯示/boot/grub/grub.conf中以至少一個空白字元開頭的行;
# grep "^[[:space:]]\{1,\}[^[:space:]]\{1,\}" /boot/grub/grub.conf
6、找出/etc/passwd檔案中一位數或兩位數;
# grep --color=auto "\<[0-9]\{1,2\}\>" /etc/passwd
7、找出ifconfig命令結果中的1到255之間的整數;
# ifconfig | grep -E --color=auto "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"
8、檢視當前系統上root使用者的所有資訊;
# grep "^root\>" /etc/passwd
9、新增使用者bash和testbash、basher,而後找出當前系統上其使用者名稱和預設shell相同的使用者;
# grep --color=auto "^\([[:alnum:]]\{1,\}\)\>.*\1$" /etc/passwd
10、找出netstat -tan命令執行的結果中以“LISTEN”或“ESTABLISHED”結尾的行;
11、取出當前系統上所有使用者的shell,要求:每種shell只顯示一次,且按升序顯示;
# cut -d: -f7 /etc/passwd | sort -u
挑戰題:寫一個模式,能匹配真正意義上的IP地址;(1.0.0.1--223.255.255.254)
grep, egrep, fgrep
egrep: 使用擴充套件正則表達來構建模式,相當於grep -E
元字元:
字元匹配:
.: 任意單個字元
[]: 指定範圍內的任意單個字元
[^]: 指定範圍外的任意單個字元
次數匹配:
*:匹配其前面的字元任意次;
?: 匹配其前面的字元0或1次;
+: 匹配其前面的字元至少1次
{m}: 匹配其前面的字元m次;
{m,n}: 至少m次,至多n次
{m,}: 至少m次;
{0,n}:至多n次;
錨定:
^: 行首
$: 行尾
\<, \b: 詞首
\>, \b:詞尾
分組:
(): 分組
|: 或者, ac|bc
grep -E "con(C|c)at"
conCat或concat
練習:寫一個指令碼,分別統計/etc/rc.d/rc.sysinit、/etc/init.d/functions和/etc/fstab檔案中各自以#開頭的行的行數,以及空白行的行數;
練習:寫一個指令碼,分別複製/etc/rc.d/rc.sysinit、/etc/init.d/functions和/etc/fstab檔案至/tmp目錄中,檔名為原名後跟上當前的日期組成;
例如第一個檔案複製後的名稱為/tmp/rc.sysinit-2-14-02-16;
練習:寫一個指令碼
顯示當前系統上所有預設shell為bash的使用者的使用者名稱、UID以及其在/etc/passwd檔案中的行號;
egrep:
\(\)-->()
\{\}-->{}
?
+
|: C|cat匹配C或cat
(C|c)at匹配Cat或cat
^$空行
grep:
\<\>精確匹配
[[:space:]]空白字元
[^[:space:]]非空白字元
find -a
-o
-not !
\<鎖定詞首
\>鎖定詞尾
\<\>
[[:punct:]]標點符號
\{m,n\}
\{m,\}
\{0,m\}
\{m\}
****
sed:
sed [option] 'script' input_file
sed -f file input_file
#cat 3
s/root/ruut/gp
#sed -n -f 3 /etc/passwd
sed編輯器基礎
1 更多的替換選項
sed '[address]s/pattern/replacement/flags' data5
有四種可用的替換標記:數字
g 全域性替換
i 不區分字元大小寫
p
w 儲存檔案(只有匹配模式的行才儲存到檔案)
-n:禁止預設輸出,常與p配合使用
-r:支援擴充套件的正則表示式
-e 'script' -e 'script': 指定多個編輯指令
#sed -n -e '/root/p' -e '/name/p' /etc/passwd
#sed -n -e '/root/p;/name/p' /etc/passwd
#sed -n '{/root/p;/name/p}' /etc/passwd
#sed -n '2,8{/root/p;/name/p}' /etc/passwd
-i: 直接編輯原檔案
address定界符,有兩種形式的行定址:
1)行的數字範圍 2s/; 2,4s/; 2,$s/
2)用文字模式來過濾出某行(正則表示式)
sed -n '/^bin/,/mail/p' /etc/passwd
組合命令
sed '2,4{s/fox/elephant/;s/dog/cat/}' data1
2 刪除行d
2d; 2,4d; /fseeio/d; /abc/,/def/d;
3 插入和附加文字
插入:sed '[address]i\文字' data1 匹配行的前一行插入
附加:sed '[address]a\文字' data1 匹配行的後一行附加
插入多行:sed '[address]i\文字1\n文字2' data1
(\n表示換行,附加多行同上)
4 修改行c
sed '[address]c\文字' data1
5 字元轉換命令y
sed '[address]y/inchars/outchars/'
inchars和outchars值一對一對映,長度必須相等
6 列印p
1)小寫p列印文字行,與-n配合使用
2)等號=命令用來列印行號
sed -n '1,3=;p' /etc/passwd
3)l命令用來列出行,打印出文字和ASCII字元,如\t
7 向檔案寫入 w
[address]w filename
sed -n '/^root/w root.txt' /etc/passwd
sed -n '1,3w root.txt' /etc/passwd
8 從檔案讀取資料r
[address]r filename
只能指定單獨一個行號或文字模式地址,sed將讀入的資料插入到地址後
9 n 移到模式匹配行的下一行再進行處理
N 合併模式匹配行及下一行;和d一起使用時,會在模式空間中刪除2行,而D會刪除第一行
10 !取反
sed -n '/root/!p' /etc/passwd
11 &
練習:
1、替換/etc/inittab檔案中“id:3:initdefault:”一行中的數字為5;
# sed '[email protected]\(id:\)[0-9]\(:initdefault\)@\15\2' /etc/inittab
2、刪除/etc/init.d/funcions檔案中的空白行;
# sed '/^$/d' /etc/ini.t/functions
3、刪除/etc/inittab檔案中位於行首的#;
# sed '[email protected]^#@@g' /etc/initta
4、刪除/etc/rc.d/rc.sysinit檔案中以#後跟至少一個空白字元開頭的行的行首的#和空白字元;
# sed '[email protected]^#[[:space:]]\{1,\}@@g' /etc/rc.d/rc.sysinit
5、刪除/boot/grub/grub.conf檔案中行首的空白字元;
# sed '[email protected]^[[:space:]]\{1,\}@@' /boot/grub/grub.conf
6、取出一個檔案路徑的目錄名稱,如/etc/sysconfig/network,其目錄為/etc/sysconfig,功能類似dirname命令;
# echo /etc/sysconfig/network-scripts/ifcfg-eth0/ | sed '[email protected][^/]\{1,\}/\[email protected]@'
*********************************************