加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则与sed,grep,awk三剑客

发布时间:2020-12-14 06:11:12 所属栏目:百科 来源:网络整理
导读:/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等写入以上三个文件 ? 正

/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}?左边的字符n到m个

{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 "boldboyb" ?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?删除1到4行

sed ‘1d;4d‘ test?删除1行和4行

sed ‘3p‘ test?打印第三行

sed -n ‘3p‘ test

sed ‘3c 1111‘ test?覆盖第三行

sed ‘3a 22222‘ 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 ‘3214/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.

[[email?protected] 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/d’?test.txt ???/ /?两个斜线之间表示要过滤的内容,d表示对过滤内容采取什么动作

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

awk /[^oldboy]/ test.txt

?

2.查看ett.txt(100行)内第20到30行内容

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 ‘[email?protected]‘ [email?protected] 所有的

echo ‘$#‘ $# ???总共多少个

echo ‘$?‘ $? 执行是否正确的输出

[[email?protected] 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

[email?protected] 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}‘

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读