正則與sed,grep,awk三劍客


系統登錄順序:

/etc/profile

/etc/profile.d/a.sh (a.sh自己建的)

/root/.bash_profile

/root/.bashrc

/etc/bashrc

 

/bin/bash 提供命令解釋器(終端)

直接打/bin/bash 非登錄shell

/root/.bashrc

/etc/bashrc

/etc/profile.d/a

 

可將別名alias等寫入以上三個文件

 

正則表達式:

 

grep

-n  只顯示行號

-o 只顯示匹配內容

-q  安靜模式,不打印     echo $?  0顯示輸出正確

-l 過濾成功顯示文件名,不成功無

-A 2 'root' /etc/passwd 過濾root所在后兩行 (顯示錯誤相關信息)

-B 5 'root' /etc/passwd 過濾root所在前5

-C  如果匹配成功,則將匹配行及前后n行都打印出來 -color

-c  如果匹配成功,顯示行數

-E  egrep

-i 忽略大小寫

-v  取反

-w  過濾單詞,(不連貫)

-r  遞歸

 

^ 以開頭的   ^b.n

* b* 前面字符   左面的一個字符0或無窮個 ab*

egrep + 一個或無窮個

 ab{3} 匹配b三次

egrep -w 'ab{3}' a.txt 匹配單詞

egrep -w 'ab{3}$' a.txt

'ab{2,4}'

? 左面字符出現0次或一次

root123

ROot ass

Root_123

r00ts

root 123

 

egrep

 

*  左面的一個字符有0個或無窮個    

+  左面的一個字符有1個或無窮個

左面的一個字符有0個或一個

{n}  左面的那個字符有n egrep -w 'ab{3}$' a.txt

{n,m} 左邊的字符nm

{n,}  左邊的字符n個到無窮個

 

 

egrep r([abc123\/\-])t   -必須放到最后去 -在數字后有指向性,如果想要匹配的字符就是-本身,必須放到最后去[12312\-]

egrep r[]

[] 定義好范圍取一個

.  任意取一個

egrep r.t a.txt  

egrep '[]'

egrep '[a-zA-Z]' a.txt  所有英文字母的

'r[aa-zz]t'一樣的

r[0-9]{2}t  =====  r[0-9][0-9]t

'r[0-9]+t'    數字有一個或無窮個

 

'^[^0-9]' 開頭取反 以非數字開頭的  

 

egrep 'company(y|ies)' a.txt 或的關系

 

 

grep "^m" oldboy.log

grep -n "^$" 1.log 打印空行及行號

grep -vn "^$" 1.log 打印空行以外的及行號

     -i 忽略大小寫的不同

 -c 計算搜索字符串的次數           3

 -o 顯示搜索的(只匹配輸出)    3個m

 -a 以文本文件的方式搜索數據

 -n 對匹配的內容在其行首顯示行號

--color=auto 以特定顏色亮顯示匹配關鍵字

-C  context,顯示匹配字符串及其前后各num行

 

[abc] 匹配字符集合內的任意一個字符[a-zA-Z],[0-9]   [a-z]所有小寫字母 [A-Z]所有大寫字母

[^abc] 匹配不包含^后的任意(任意一個)字符的內容

a\{n,m\} 重復n到m次,前一個重復的字符,如果用egrep/sed -r 可以去掉斜線

a\{n,\}  重復至少n次,前一個重復的字符。如果用egrep/sed -r 可以去掉斜線

a\{n\}  重復n次,前一個重復的字符。如果egrep/sed -r 可以去掉斜線

a\{,m\}  隨便重復,但是不能超過m次

注意:egrep或sed -r 過濾一般特殊字符可以不轉義

 

grep “0\{,3\}”  oldboy.log

grep -E "0{,3}" oldboy.log

egrep "0{,3}" oldboy.log

 

5.擴展正則

必須用 grep -E 或egrep

 

(1)+ 重復一個或一個以上前面的字符(和基礎正則*的區別) +要求重復數量至少為1,*可以為0,所以字符串為空也可以匹配

基礎正則*是匹配0個或多個前面的那個字符

(2)?重復“0個或一個”前面的字符 (和基礎正則.的區別)

      (可以沒有) 基礎正則.是匹配有且只有一個字符,代表任意一個字符

(3)|用或的方式查符合多個條件的字符串

(4)()找出“用戶組”字符串  分組過濾,后向引用

 

例子:

egrep "go+d" 1.txt

egrep "go*d" 1.txt

egrep "go?d" 1.txt

egrep "go.d" 1.txt

egrep "god|good" 1.txt

egrep "g(o|oo)d" 1.txt

 

\b 取出單詞邊界

grep "\boldboy\b"  oldboy.log    只取出oldboy的,oldboy1不

 

        a  ∶新增, a 的后面可以接字串,而這些字串會在新的一行出現(目前的下一行)

        c  ∶取代, c 的后面可以接字串,這些字串可以取代 n1,n2 之間的行!

        d  ∶刪除,因為是刪除啊,所以 d 后面通常不接任何咚咚;

        i  ∶插入, i 的后面可以接字串,而這些字串會在新的一行出現(目前的上一行)

        p  ∶列印,亦即將某個選擇的資料印出。通常 p 會與參數 sed -n 一起運作~

        s  ∶取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配正規表示法!例如 1,20s/old/new/g 就是啦!sed -n 靜態模式

sed -e 多個模式

sed -i '' test 輸出到文件

sed -f '' 指定文件

sed '3d' test 刪除第三行

sed '1,4d' test 刪除14

sed '1d;4d' test 刪除1行和4

sed '3p' test 打印第三行

sed -n '3p' test

sed '3c 1111' test 覆蓋第三行

sed '3a 11111' test 第三行后追加一行

sed '3i 111' test   第三行前插入

 

sed '/sb.*$/d' a.txt     匹配0或沒有   ========  sed '/sb/d' a.txt

sed '/^s/c  111' a.txt  

 

 

sed 's/sb/SB/'  test     只改每行遇到的第一個sb

sed 's/sb/SB/g' test  改所有的sb

sed '4s/sb/SB/g' test  只改所有的sb

sed 'aa/sb/SB/g' test  aa那行的sb改了

sed '/^[0-9][a-z]+sb$/s/sb/SB/g' test   匹配一行內容所有表達

sed -r '/^[0-9] [a-Z]+)xsb$ /s/sb/SB/g' a.txt   擴展正則  匹配alexsb

 

sed -r 's///g' test  定位 /換的源/換的結果/g

 

sed -r '\3\2\1\4/g'

 

sed -r '###'

sed -ri '///'

例子:

1.

root123

ROot ass

Root_123

r00ts

root 123

2.

root123

ROot ass

Root_123

r00ts

root 123

3.

a

ab

abb

abbb

abbbb

abbnbb

abbbbbbc

4.

r1t

r2t

r3t

r/t

r-t

r34t

r34352t

 

5.

[root@localhost tmp]# cat test

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

operator:x:11:0:operator:/root:/sbin/nologin

 

6.

12company12121

21321companiesafasf

 

7.

1rootsb

2tomsb

3egon

4alexsb

5wupeiqisb

6yuanhaosb

7sb

8sb2

 

 

awk

awk [ options ] 'pattern {action}' file

awk 參數 模式(動作) file  模式即條件  動作就是干什么,由大括號里面一條或多條語句組成。

pattern 即模式,找誰    action 干啥

域和記錄

filed    域,區域,字段,列

 

$0,整行,一個記錄  $1 $2 $3 $NF最后一行 $0整行

$ 表示取

FS 區域分隔符  awk -F 記錄字段分隔符的內容

NF 列的數量一行有多少列(區域)

head /etc/passwd > /servers/files/awkfile.txt

awk -F ":" 'NR>=3&&NR<=5{print $1,$3}' /servers/files/a.txt

字段分隔符FS 指定的值可以是一個正則表達式(匹配字符串)

ifconfig eth1 | awk 'NR==2{print $1}'     輸出inet6    為第一列

ifconfig eth1 | awk -F "[: ]+" 'NR==2{print $2}'  輸出inet6  分割完變成第二列

RS 每個記錄讀入(輸入)的時候的分隔符  上下分割每行

NR 行號 awk處理的記錄的數

ORS 輸出時候的分隔符

awk使用內置變量RS來存放記錄分隔符,RS表示的輸入的記錄分隔符,之歌值可通過BEGIN模塊重新定義修改。

awk 'BEGIN{FS=":";RS="\n"}'

awk '{print NR,$0}' 1.txt  顯示行號

awk 'BEGIN{RS="/"}{print NR,$0}' 1.txt

行:默認以回車換行\n,結束的.RS(行分隔符)RS表示着行的結束。

RS為空值

awk 'BEGIN{RS=""}{print NR,$0}' 1.txt     只會顯示一行行號

RS值為空時,每個記錄被空行或多個空行分割,同時無論FS分隔符為何值,FS同時也會被\n分割。

sed -r 's#[:/0-9]+# #g' awkfile.txt

sed -r 's#[:/0-9]+# #g' awkfile.txt >count.txt

 

 

sort 排序

sort 默認是升序,sort -r 降序

sort -u 去除重復行

 

uniq 去重

  -i 忽略大小寫字符

  -c 進行計數

  -u 只顯示唯一的行

 

cut   從文件文件中截取

  -d 后接分割字符

  -f 依據-d的分隔符將信息分割成數段,-f 取出第幾段

  -c 以字符的單位取出固定字符區間

 

PATH 變量取出,我要找出第三和第五個路徑。

#echo $PATH | cut -d ':' -f 3,5

/sbin:/usr/local/bin

 

PATH 變量取出,我要找出第三到最后一個路徑。

echo $PATH | cut -d ':' -f 3-

/sbin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin:/usr/games

 

PATH 變量取出,我要找出第一到第三個路徑。

#echo $PATH | cut -d ':' -f 1-3

/bin:/usr/bin:/sbin:

 

PATH 變量取出,我要找出第一到第三,還有第五個路徑。

echo $PATH | cut -d ':' -f 1-3,5

/bin:/usr/bin:/sbin:/usr/local/bin

 

 

wc   統計

  -l 僅取出列,統計行數

  -w 僅列出多少字,統計單詞出現次數

  -m 多少字符,統計文件的字節數

  wc /etc/passwd

 40(行數) 45(單詞數)1719(字節數)

 

求記錄文件中每個單詞的重復數量

egrep -o "[a-zA-Z]+" count.txt |sort |uniq -c

awk 'BEGIN{RS=" |\n"}{print $0}' count.txt|sort |uniq -c   空格或換行符

awk 默認用\n 分割   

 

正則表達式

實戰准備

1.調整別名

alias grep='grep --color=auto'

2.環境變量

locale

export LC_ALL=C

3.准備例子

vi /oldboy/old.log

I am oldboy teacher!

I teach linux

 

I like badminton ball,billiard ball and chinese chess!

my blog is http://oldboy.blog.51cto.com

our site is http://www.etiantian.org

my qq num is 49000448

 

not 4900000448

my god,i am not oldbey,but OLDBOY!

god

good

goood

gd

 

 

 

 

  

 

6.sed

 

例子:

1.除了oldboy以外的

vi  test.txt    --  

test

liyao

oldboy

 

五種方法:

grep -v oldboy test.txt

head -2 test.txt

sed /oldboy/dtest.txt    / / 兩個斜線之間表示要過濾的內容,d表示對過濾內容采取什么動作

sed -n /[^oldboy]/p  test.txt

awk /[^oldboy]/ test.txt

 

2.查看ett.txt100)內第2030行內容

seq 100>ett.txt

   head 取頭部的幾行,默認前10

1.head -30 ett.txt |tail -11               tail 取尾部的最后n行,默認后10行(tail 文件)

2.tail -81 ett.txt |tail -11

3.sed -n '20,30p' ett.txt

 

sed -n '30p' ett.txt 也可以用的

 

 

 

 

sed '2s/root/sb/g' 1.txt  改第二行所有root

sed '2s/root/sb/'  1.txt  改第二行第一個

 

awk

awk -F'{print $1,$4}' /etc/passwd 指定分隔符

$0 整行

NF 多少段  $NF 最后一段

NR 行號 (直接NR

awk -F: 'NR==1{print $1,NR}' test

awk -F: 'NR<=3{print NR,"---"$1}' test    '  " "  '自己定義輸出

'NR>=3 && NR<=5{print NR,"-------",$1}'  test

'NR<=2 || NR>=7{print NR,"-------",$1}'  test

'/nologin$/{print $1}' test

'$1~/^r.*t$/{print $3,NR}' tes

'$3 >=7{print NR,$1}'  test

count=7

awk -v x=$count -F: '$3 >= x{print NR,$1,$3}' test

UID大於等於x的打出來

 

ifocnifg |awk 'NR==2{print $2}'

 

cat a.txt |sort |uniq -c

cat test |cut -d: -f1

du -sh 統計文件大小

find / -type f  (普通文件)

find / -name "*.txt"

find / -size +10M and -size -30M  

dd if=/dev/zero  of=/a.txt bs=20M count=1

grep -rl 'root' /test  遞歸查詢內容顯示文件夾

 

 

 

shell

vi set-host.sh

read -p 'please input your hostname:'  name

hostnamectl set-hostname $name

 

 

yum -y install bc

scale浮點運算   bc百分率運算

0.71 根據小數點后面scale后移,如果三位移動3

 

 

 

變量

set

env

echo $1

unset $1

echo $PWD  大寫字母為系統變量

改用戶 PS1

PS1=''

 

全局變量:自己及多有人都能取到

 

運算

((2<10))  

echo $?

0

 

x=2

y=2

[ $x -ge $y ]

echo $?

 

 

gt大於

lt小於

ge大於等於

le小於等於

eq等於

ne不等於

 

[ $x -gt $y -a $a -gt $b ]

[ $x -ge $y -o $a -le $b ]

 

+= 意思  x=$x+1

((x=x+3)) ======  x+=3

 

 

((i++)) 自增1

$((x+=1))

 

x=1

a=$((x+=1))

echo $a

 

mem_use=`free | awk  'NR==3{print $2}'`

mem_use=`free | awk  'NR==3{print $3}'`

echo "scale=2;$mem_use/$mem_total" |bc -l |cut -d . -f2

 

 

測試文件狀態

-d 目錄

-s 文件長度 > 0、非空

-f 正規文件

-w 可寫

 

-r 可讀

 

-x 可執行

 

-L 符號連接

 

-u 文件有 suid 位設置

 

 

= 兩個字符串相等

!= 兩個字符串不相等

-z 空串

-n 非空串

 

vi 1.sh

#!/bin/bash

var='/etc/init.d'

var='/etc/passwd'

if [ -d $var ]

    then

        echo "$var is dictionary"

 

elif [ -b $var ]

    then

        echo "$var is block"

elif [ -f $var ]

    then

        echo "$var is regular file"

else

        echo 'unknow'

fi

 

 

if [ $x -eq 1 ];then echo 'x is 1';fi

 

vi test.sh

#test.sh

echo $0

echo $1

echo $2

echo $3

echo ${11}

echo '$$' $$    這個進程的pid

echo '$*' $* 所有的

echo '$@' $@ 所有的

echo '$#' $#    總共多少個

echo '$?' $? 執行是否正確的輸出

[root@localhost tmp]# ./test.sh 1 2 3 4 5 6 7 8 9 10 11

./test.sh

1

2

3

11

$$ 7800

$* 1 2 3 4 5 6 7 8 9 10 11

$@ 1 2 3 4 5 6 7 8 9 10 11

$# 11

$? 0

 

 

 

 

 

 

 

 

 

 

expr 1 + 2

expr 99 / 134  

yum install bc -y 浮點運算

 

echo 'scale=2;30/1000' | bc -l

 

free | awk 'NR==2{print $2}'

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM