1. 程式人生 > >grep 正則表達式 vim

grep 正則表達式 vim

oot 命令結果 function lin tom 內容 原理 root rc.d

一:umask:

當我們登錄系統之後創建一個文件總是有一個默認權限的,那麽這個權限是怎麽來的呢?這就是umask幹的事情。umask設置了用戶創建文件的默認 權限,它與chmod的效果剛好相反,umask設置的是權限"補碼",而chmod設置的是文件權限碼。一般可在/etc/profile、/etc/bashrc、$ [HOME]/.bash_profile、$[HOME]/.profile或$[HOME]/.bashrc中設置umask值。具體取決於Linux發行版。

修改方式為:umask xxx,這種方式修改後不能長期存在(類似於系統的變量),要想一直存在,umask值可以存儲在/etc/bashrc當中,使所有用戶均被設置,也可以存在~/.bashrc只對某用戶設置。

二:grep

--color=auto 關鍵字高亮顯示

-v 反向搜索

-i 忽略大小寫

-n 顯示行號

-c 不顯示搜索結果,僅顯示匹配的行數

-o 僅顯示匹配到的字符串

-q 靜默輸出

grep -q root /etc/passwd

echo $?

若$?為0表示執行成功若結果為1,表示未找到該字符串

grep -q root /etc/passwd && echo 找到了 ||echo 未找到

grep -q root /etc/passwd &> /dev/null && echo 找到了 ||echo 未找到

以上兩個例子效果相同原理不一。要註意。

-A # 顯示搜索行及其向下相臨的#行

-B # 顯示搜索行及其向上相臨的#行

例子:nmap -v -sP 172.18.250.0/24 |grep -B1 'Host is up' |grep for |cut -d" " -f5

-C # 顯示搜索行及其向上和向下相臨的#行

-e char1 -e char2 [-e charN] 多個選項間or關系

-w 匹配整個單詞

-E 或egrep 支持擴展正則表達式

-F 或fgrep 不支持正則表達式

grep "$USER" /etc/passwd :顯示變量;

grep '$USER' /etc/passwd :顯示字符串$USER

grep `whoami` /etc/passwd :顯示命令執行的結果

三:正則表達式

正則表達式由一類特殊字符及文本字符所編寫的模式,其中有些字符(元字符)不表示字符字面意義,而表示控制或通配的功能。grep、awk、sed等命令可以支持正則表達式。

元字符分類:字符匹配,匹配次數,位置錨定,分組。

例子:去除配置文件中的註釋行和空白行

grep -v "^#\|^[[:blank:]]*$" /etc/httpd/conf/httpd.conf

通配符用來匹配符合條件的文件名,通配符是完全匹配。ls、find、cp這些命令不支持正則表達式,所以只能使用shell自己的通配符來進行匹配了。通配符必須是完全匹配

通配符


元字符作用
*匹配0個或任意多個字符,也就是可以匹配任何內容
匹配任意一個字符
[]匹配[ ]中任意一個字符
[-]匹配括號中任意一個字符,-代表一個範圍,例如:[a-z]代表匹配一個小寫字母
[^]邏輯非,表示匹配不是中括號內的一個字符,例如[^0-9]代表匹配一個不是數字的字符


基礎正則表達式


元字符作用
*前一個字符匹配0次或任意多次,匹配0次前一個字符則表示匹配任意字符,包括空白行
.匹配除了換行符以外任意一個字符,“.*”匹配所有內容
^用於指定匹配字符串的頭部,也稱行首定位符;匹配行首。例如:^hello會匹配以hello開頭的行,grep -n “^$” test.txt匹配空白行並顯示行號
$用於指定匹配字符串的尾部,也稱行尾定位符;匹配行尾。例如:hello$會匹配以hello結尾的行
[]匹配中括號中指定的任意一個字符,只匹配一個字符,要匹配[則要轉義\[
[^]匹配除中括號的字符以外的任意一個字符
\轉義符用於取消特殊符號的含義,匹配包含以.結尾的行grep “\.$” test.txt
\{n\}表示其前面的字符恰好出現n次。例如:[0-9]\{4\}匹配4位數字,但註意添加兩邊的定界符,以精確匹配
\{n,\}表示其前面的字符出現不小於n次。例如:[0-9]\{2,\}匹配2位以上的數字
\{,n\}表示其前面的字符出現不大於n次。例如:[0-9]\{,2\}匹配2位以下的數字
\{n,m\}表示其前面的字符至少出現n次,最多出現m次。例如:[a-z]\{6,8}匹配6到8位的小寫字母

元字符

描述

[:lower:]

小寫字母

[:upper:]

大寫字母

[:alpha:]

所有字母

[:digit:]

數字

[:alnum:]

所有數字和字母

[:punct:]

標點符號

[:space:]

空白字符

\?

匹配其前面的字符1次或0次

\+匹配其前面的字符至少1次

^$(^[:space:]*$)

表示空行(空白行)

\<或\b

鉚定詞首,其後面的任意字符必須作為單詞的首部出現

\>或\b

鉚定詞尾,其前面的任意字符必須作為單詞的尾部出現

\(\)

分組

\(ab\)*

ab作為一個整體,可以出現任意次

\(ab\).*\1

引用第一個左括號以及與之對應的右括號所包括的所有內容

\(ab\).*\2

引用第二個左括號以及與之對應的右括號所包括的所有內容


擴展正則表達式


元字符作用
|管道符,表示“或”,即匹配其中任何一個,”book|desk”將匹配”book”或”desk”
-減號,用於指明字符範圍, “[a-c]”將匹配包含a、b和c中任意一個字符的字符串

字符匹配

.

匹配任意單個字符

[]

匹配指定範圍內的任意單個字符

[^]

匹配指定範圍外的任意單個字符

次數匹配

*

匹配其前字符任意次

?

匹配其前字符0次或1次

+

匹配其前字符至少1次,類似於基本正則表達式\{1,\}

{m,n}

匹配其前面的字符至少m次,至多n次

位置鉚定

^

行首

$

行尾

\<或\b

詞首

\>或\b

詞尾

分組

().*\1\2\3


或者

|

or a|b ,a或者b ,有一個就行

C|cat--> C或cat

(C|c)at-->Cat或cat

單引號’’強引用,不做變量替換的

雙引號””弱引用,內部的變量會替換

四:非貪婪匹配

貪婪匹配
在滿足匹配時,匹配盡可能長的字符串,默認情況下采用貪婪匹配

string pattern1 = @"a.*c";   // greedy match Regex regex = new Regex(pattern1);
regex.Match("abcabc"); // return "abcabc" 123

非貪婪匹配
在滿足匹配時,匹配盡可能短的字符串,使用?表示非貪婪匹配

string pattern1 = @"a.*?c";   // non-greedy match Regex regex = new Regex(pattern1);
regex.Match("abcabc"); // return "abc"1234

幾個常用的非貪婪匹配Pattern

      • *? 重復任意次,但盡可能少重復

      • +? 重復一次貨更多次,但盡可能少重復

      • ?? 重復0次或1次,但盡可能少重復

      • {n, m}? 重復n到m次,但盡可能少重復

      • {n,}? 重復n次以上,但盡可能少重復

  • 練習:

1、顯示/proc/meminfo文件中以大小s開頭的行(要求:使用兩種方法)

cat /proc/meminfo |grep "^s\|S"

cat /proc/meminfo |grep -i ^s

grep ^[sS] /proc/meminfo

grep -e ^s -e ^S /proc/meminfo

2、顯示/etc/passwd文件中不以/bin/bash結尾的行

cat /etc/passwd |grep -v "/bin/bash$"

3、顯示用戶rpc默認的shell程序

grep -w "^rpc" /etc/passwd |cut -d: -f7

4、找出/etc/passwd中的兩位或三位數

cat /etc/passwd | grep -o "\<[[:digit:]]\{2,3\}\>"

5、顯示CentOS7的/etc/grub2.cfg文件中,至少以一個空白字符開頭的且後面存非空白字符的行

cat /etc/grub2.cfg | grep "^[[:space:]]\+[^[:space:]]"

6、找出“netstat -tan”命令的結果中以‘LISTEN’後跟任意多個空白字符結尾的行

netstat -tan | grep "LISTEN[[:space:]]\+$"

7、顯示CentOS7上所有系統用戶的用戶名和UID

cat /etc/passwd |cut -d: -f1,3 | grep "\<[0-9]\{1,3\}\>"

8、添加用戶bash、testbash、basher、sh、nologin(其shell為/sbin/nologin),找出/etc/passwd用戶名同shell名的行

cat /etc/passwd | grep "\(^.*\)\>.*\<\1$"

9、利用df和grep,取出磁盤各分區利用率,並從大到小排序

df | grep -o "[0-9]\{1,3\}%" | grep -o "[0-9]\+" | sort -nr

df |grep "^/dev/sd" |grep -o "[[:digit:]]\{1,3\}%" |tr -d % |sort -nr

作業:

1、顯示三個用戶root、mage、wang的UID和默認shell

cat /etc/passwd|cut -d: -f1,3|grep -e "root\>" -e "mage"\ -e "wang\>"

2、找出/etc/rc.d/init.d/functions文件中行首為某單詞(包括下劃線)後面跟一個小括號的行

grep "(^[[:alpha:]]+|^_+.*)\(\)" /etc/rc.d/init.d/functions

3、使用egrep取出/etc/rc.d/init.d/functions中其基名

echo /etc/rc.d/init.d/functions | egrep -o "[^/]+$"

4、使用egrep取出上面路徑的目錄名

echo /etc/rc.d/init.d/functions | egrep -o "^.*\/" | egrep -o "^.*[^/]"

5、統計last命令中以root登錄的每個主機IP地址登錄次數

last |egrep "\<root\>" |tr -s " "|cut -d " " -f1,3|sort|uniq -c

6、利用擴展正則表達式分別表示0-9、10-99、100-199、200-249、250-255

[0-9] [1-9][0-9] 1[0-9]{2} 2[0-4][0-9] 25[0-5]

7、顯示ifconfig命令結果中所有IPv4地址

ifconfig |grep "inet\b"|tr -s " "|cut -d" " -f3

8、將此字符串:welcome to magedu linux 中的每個字符去重並排序,重復次數多的排到前面

echo welcome to magedu linux |grep -o [[:alpha:]]|sort|uniq -c|sort -rn


四:vim

三種主要模式

命令模式 (default): 移動光標,復制,剪切,粘貼,撤銷,重做,搜索,進入其他模式

移動光標:

h向左移動

l向右移動

j向下移動

k向上移動

配合#h,#l,#j,#k可一次性移動#個字符

w跳到下一個單詞的詞首

b跳到上一個單詞的詞首

H跳到當前頁首

M跳到當前頁中

L跳到當前頁尾

gg跳到整個文件的首行

G跳到整個文件的末行

^移到非空格開頭的行首

$移到行尾

#G跳到指定行,或退出模式下:#

Ctrl+f: 向文件尾部翻一屏

Ctrl+b: 向文件首部翻一屏

Ctrl+d: 向文件尾部翻半屏

Ctrl+u:向文件首部翻半屏

r替換一個字符

d剪切

dd剪切當前行

#dd剪切#行

dw剪切一個單詞

d^從光標所在處剪切到行首

d$或D從光標所在處剪切到行尾


y復制

yy或Y復制當前行

#yy復制#行

yw復制一個單詞

y^從光標所在處復制到行首

y$從光標所在處復制到行尾


p粘貼

p當前行向下粘貼或光標所在處向後粘貼

P當前行向上粘貼或光標所在處向前粘貼

替換模式 R進入 Esc退出


從命令模式進入插入模式

i光標在哪從哪進入

I光標移至行首同時進入插入模式

a光標向後移一個字符同時進入插入模式

A光標移至行尾同時進入插入模式

o光標向下插入一新行同時進入插入模式

O光標向上插入一新行同時進入插入模式

插入模式:文本編輯

退出模式:保存、退出

w:保存

q:退出

q!強制退出

wq或x 保存並退出

w!當前用戶為該文件所屬人時,如果該文件為read only,可加上!強制保存。

在退出模式下返回命令模式EscEsc或Enter

r /path/filename 讀取另一個文件的內容並將輸出結果寫入文件

w /path/filename 另存為(確認當前用戶對該路徑中的最後一級目錄有wx權限)

! command 執行某條命令,將輸出結果顯示在終端上

r! command 執行某條命令,在光標所在的當前行向下插入新行並將輸出結果輸入

.! command 執行某條命令,替換光標所在的當前行並將輸出結果輸入

搜索

/關鍵字

n向下找

N向上找

?關鍵字

n向上找

N向下找



例子:

dog pig dog cat dog

pig dog root dog cat

dog linux roat dog cat

pig root dog cat dog pig

fish dog rooter pig dog

bird dog cat rbbt pig


把以上內容中的rxxt換成rxxter,已經是rxxter的不變

%s@\(r..t\)\>@\1er@gi


http://mirrors.163.com/ 換成https://mirrors.sina.com/dvd


:%s@http://mirrors.163.com@https://mirrors.sina.com/dvd@gi


作業:

1、復制/etc/profile至/tmp/目錄,用查找替換命令刪除/tmp/profile文件中的行首的空白字符

:%s@^[[:blank:]]\+@@g

2、復制/etc/rc.d/init.d/functions文件至/tmp目錄,用查找替換命令為/tmp/functions的每行開頭為空白字符的行的行首添加一個#號

:%s@\(^[[:blank:]]\+\)@#\1@g



grep 正則表達式 vim