美文网首页
linux基础day10

linux基础day10

作者: 不知道就 | 来源:发表于2019-08-05 18:21 被阅读0次

通配符知识:
1、基本含义
通配符简单说就是键盘上的一些特殊字符,可以实现某些特殊的功能,
例如,可以用*代表所有,来模糊搜索系统中的文件。
2、范围:通配符试用范围是命令行中【普通命令】或脚本编程中。
3、
第一组 模糊匹配:
准备:
[root@oldboyedu /data]# touch a.txt b.txt aa.txt test.txt
[root@oldboyedu /data]# ls 
aa.txt  a.txt  b.txt  test.txt

* 所有


两个5000工资  保险公积金  多交1600以上 13200
一个10000的  11600
笔记本多发了一个 位置多占一个 电多用 管理复杂了。

[root@oldboyedu /data]# a="oldboy"
[root@oldboyedu /data]# echo '$a'
$a
[root@oldboyedu /data]# echo "$a"
oldboy
[root@oldboyedu /data]# echo $a
oldboy
[root@oldboyedu /data]# echo "$a is a teaher."
oldboy is a teaher.
[root@oldboyedu /data]# echo $a is a teacher.
oldboy is a teacher.


[root@oldboyedu /data]# echo date
date
[root@oldboyedu /data]# echo `date`
Sun Oct 4 23:54:38 CST 2020
[root@oldboyedu /data]# 希望系统把字符串当做命令就用反引号


3W1H:
1、什么是正则表达式?
作用和特殊字符一样。
正则表达式是为处理大量的字符串及文本而定义的一套规则和方法。
开发者
假设"@"代表“I am”,"!"代表“oldboy”,
则执行echo "@!"的结果就是输出“I am oldboy”。

发明语言:
上了火星,发明火星语。
! 我喜欢你
@  滚
 
2、提高效率,快速获取到想要的内容。

3、适用于三剑客命令 grep(egrep),sed,awk
   以行为单位处理。
4、实践来讲解

易混淆事项
1、和通配符区别。
2、开发人员正则,一般是Perl兼容正则表达式。
3、Linux系统三剑客正则表达式******。

环境准备:

export LC_ALL=C

分类:
1、BRE  grep
2、ERE  egrep

[root@oldboyedu ~/test]# grep "^I" oldboy.txt 
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
[root@oldboyedu ~/test]# ls /data
a.txt  aa.txt  b.txt  c.txt  f.txt  test.txt
[root@oldboyedu ~/test]# mkdir /data/oldboy
[root@oldboyedu ~/test]# ls -l /data
total 0
-rw-r--r--. 1 root root 0 Oct  4 23:28 a.txt
-rw-r--r--. 1 root root 0 Oct  4 23:28 aa.txt
-rw-r--r--. 1 root root 0 Oct  4 23:28 b.txt
-rw-r--r--. 1 root root 0 Oct  4 23:38 c.txt
-rw-r--r--. 1 root root 0 Oct  4 23:38 f.txt
drwxr-xr-x. 2 root root 6 Oct  5 01:08 oldboy
-rw-r--r--. 1 root root 0 Oct  4 23:28 test.txt
[root@oldboyedu ~/test]# ls -l /data|grep "^d"
drwxr-xr-x. 2 root root 6 Oct  5 01:08 oldboy


es?   匹配e es 
es*   匹配e es ess essssss essssssssss 更多s。

?0
0?

代表 自身是 .代表任意一个字符。

匹配 ? 匹配前一个字符。


e*s* 和e?s?
e*  空 e ee eeee eeeeee
s*  空 s ss sss ssssssssssssss
e*s* 空 es e s ees essssss

e?s? 空 e s es 
e? 空 e
s? 空 s
=========================================
e+     e ee eee eeeee  .........
e*  空 e ee eeee eeeeee .........
e?  空 e
=========================================
a{n,m}  匹配前一个字符最少n次,最多m次
a{n,}   匹配前一个字符最少n次
a{n}    匹配前一个字符正好n次
a{,m}   匹配前一个字符最多m次


(0)===\1
(0)(0)    \1             \2
       第一个括号    第二个括号

egrep -o "(e)(s)\1\2" oldboy.txt ===== egrep -o "eses" oldboy.txt 
    


特殊预定义中括号表达式
[root@oldboyedu ~/test]# egrep "[0-9]" oldboy.txt 
my qq num is 49000448.
not 4900000448.
[root@oldboyedu ~/test]# 
[root@oldboyedu ~/test]# egrep "[[:digit:]]" oldboy.txt 
my qq num is 49000448.
not 4900000448.
[root@oldboyedu ~/test]# egrep "[[:lower:]]" oldboy.txt 
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
[root@oldboyedu ~/test]# egrep "[[:upper:]]" oldboy.txt 
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my god ,i am not oldbey,but OLDBOY! 


[root@oldboyedu ~/test]# egrep "\boldboy\b" oldboy.txt 
I am oldboy teacher!
[root@oldboyedu ~/test]# egrep "oldboy" oldboy.txt 
I am oldboy teacher!
our site is http://www.oldboyedu.com
[root@oldboyedu ~/test]# egrep -w "oldboy" oldboy.txt 
I am oldboy teacher!

评书:三侠剑   老好了。
侠客、剑客


Linux三剑客
awk  sed  grep

sed
Sed是操作、过滤和转换文本内容的强大工具。
常用功能有对文件实现快速增删改查(增加、删除、修改、查询),
其中查询的功能中最常用的2大功能是过滤(过滤指定字符串)和取行(取出指定行)。

sed [选项]  [sed内置命令字符]  [文件]

选项:
-n  取消默认sed的输出,常与sed内置命令的p连用※
-i  直接修改文件内容,而不是输出到终端。

如果不使用-i选项sed只是修改在内存中的数据,并不会影响磁盘上的文件※

sed的内置命令字符说明
s 替换
g 全局global
p 打印print
d 删除delete

I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.


[root@oldboyedu ~/test]# cat oldgirl.txt
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.

问题1:输出oldboy.txt的第2-3行内容※。
sed -n '2,3p' oldgirl.txt 
     
问题2:过滤出含有oldboy字符串的行※。
sed -n '/oldboy/p' oldgirl.txt 
     
问题3:删除含有oldboy字符串的行※。
sed '/oldboy/d' oldgirl.txt
sed /oldboy/d oldgirl.txt

问题4:将文件中的oldboy字符串全部替换为oldgirl※。
vim替换:  
:%s#oldboy#oldgirl#g
sed 's#想替换啥#用啥替换#g' oldgirl.txt

sed 's#oldboy#oldgirl#g' oldgirl.txt 
修改文件:
sed -i 's#oldboy#oldgirl#g' oldgirl.txt 

问题5:将文件中的oldboy字符串全部替换为oldgirl,同时将QQ号码49000448改为31333741。
[root@oldboyedu ~/test]# sed -e 's#oldboy#oldgirl#g' -e 's#49000448#31333741#g' oldgirl.txt I 



环境:
[root@oldboyedu ~/test]# cat oldgirl.txt
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.
问题1:输出oldboy.txt的第2-3行内容※。
问题2:过滤出含有oldboy字符串的行※。
问题3:删除含有oldboy字符串的行※。
问题4:将文件中的oldboy字符串全部替换为oldgirl※。
问题5:将文件中的oldboy字符串全部替换为oldgirl,同时将QQ号码49000448改为31333741。
问题6:在oldboy.txt文件的第2行后追加文本。
问题7:在oldboy.txt文件的第2行插入文本。



删除指定行
sed -i '3d' oldgirl.txt 
sed -i '5,8d' oldgirl.txt 


环境:
[root@oldboyedu ~/test]# cat oldgirl.txt
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.
问题1:输出oldboy.txt的第2-3行内容※。
[root@oldboyedu ~/test]# sed -n '2,3p' oldgirl.txt 
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
[root@oldboyedu ~/test]# head -3 oldgirl.txt |tail -2
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com

问题2:过滤出含有oldboy字符串的行※。
[root@oldboyedu ~/test]# sed -n '/oldboy/p' oldgirl.txt 
I am oldboy teacher!
our site is http://www.oldboyedu.com
[root@oldboyedu ~/test]# grep oldboy oldgirl.txt
I am oldboy teacher!
our site is http://www.oldboyedu.com

问题3:删除含有oldboy字符串的行※。
[root@oldboyedu ~/test]# sed '/oldboy/d' oldgirl.txt 
I like badminton ball ,billiard ball and chinese chess!
my qq num is 49000448.
[root@oldboyedu ~/test]# grep -v "oldboy" oldgirl.txt
I like badminton ball ,billiard ball and chinese chess!
my qq num is 49000448.

问题4:将文件中的oldboy字符串全部替换为oldgirl※。
[root@oldboyedu ~/test]# sed 's#oldboy#oldgirl#g' oldgirl.txt
I am oldgirl teacher!
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldgirledu.com
my qq num is 49000448.
vim替换:
问题5:将文件中的oldboy字符串全部替换为oldgirl,同时将QQ号码49000448改为31333741。
[root@oldboyedu ~/test]# sed -e 's#oldboy#oldgirl#2' -e 's#49000448#31333741#g' oldgirl.txt
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 31333741.
问题6:在oldboy.txt文件的第2行后追加文本。
[root@oldboyedu ~/test]# sed '2a I teacher linux.' oldgirl.txt 
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
I teacher linux.
our site is http://www.oldboyedu.com
my qq num is 49000448.
[root@oldboyedu ~/test]# cat oldgirl.txt 
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
our site is http://www.oldboyedu.com
my qq num is 49000448.
[root@oldboyedu ~/test]# sed -i '2a I teacher linux.' oldgirl.txt 
[root@oldboyedu ~/test]# cat oldgirl.txt 
I am oldboy teacher!
I like badminton ball ,billiard ball and chinese chess!
I teacher linux.
our site is http://www.oldboyedu.com
my qq num is 49000448.
[root@oldboyedu ~/test]# sed '2i I teacher linux.i' oldgirl.txt 
I am oldboy teacher!
I teacher linux.i
I like badminton ball ,billiard ball and chinese chess!
I teacher linux.
our site is http://www.oldboyedu.com
my qq num is 49000448.

问题1:取出Linux中执行ifconfig eth0后对应的IP地址(只能输出IP地址)。

练习sed
正则是贪婪匹配模式,人性是贪婪的。

方法1:
[root@oldboyedu ~/test]# ifconfig eth0|sed -n 2p|sed 's#^.*inet ##g'|sed 's#  netm.*$##g'
10.0.0.201



方法:要取一个目标,删除目标两边的,就得到了目标:
先匹配上,然后在删除

        
[root@oldboyedu ~]# ifconfig eth0|sed -n 2p|sed 's#^.*inet ##g'|sed 's#  netm.*$##g'
10.0.0.201
[root@oldboyedu ~]# ifconfig eth0|sed -n 2p|sed -e 's#^.*inet ##g' -e 's#  netm.*$##g'
10.0.0.201
[root@oldboyedu ~]# ifconfig eth0|sed -ne 's#^.*inet ##g' -e 's#  netm.*$##gp'
10.0.0.201
[root@oldboyedu ~]# ifconfig eth0|sed -nr '2s#^.*inet (.*)  netm.*$#\1#gp'
10.0.0.201

验证是否懂了的练习题:
stat /etc/hosts自行取其中的644
        
[root@oldboyedu ~]# stat /etc/hosts
  File: ‘/etc/hosts’
  Size: 158         Blocks: 8          IO Block: 4096   regular file
Device: 803h/2051d  Inode: 16829878    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2020-10-06 20:40:18.463001804 +0800
Modify: 2013-06-07 22:31:32.000000000 +0800
Change: 2019-03-04 11:15:49.426692303 +0800
 Birth: -
[root@oldboyedu ~]# stat /etc/hosts|sed -rn 's#^.*\(0(.*)/-.*$#\1#gp'
644

考试:ip add的输出取出IP。
        
[root@oldboyedu ~]# ip add|sed -rn 's#^.*net (.*)/24.*$#\1#gp'
10.0.0.201


1、象棋,教学,比赛,活动
2、踢毽子,比赛。最牛的单人前三,小组前三。

三剑客自身有特长的。
grep 过滤查找内容。筛子
sed  取行,替换,删除,追加
awk  取列


cut 按列切割
-d 指定分隔符 -f指定哪列,多列用逗号
[root@oldboyedu ~]# cat a.txt 
1 2 3 4 5 6 7 8 9 10
[root@oldboyedu ~]# cut -d" " -f1,3,5 a.txt 
1 3 5
[root@oldboyedu ~]# cut -d" " -f3-5 a.txt 
3 4 5

练习
[root@oldboyedu ~]# sed -n '1,5p' /etc/passwd >oldboyedu.txt
[root@oldboyedu ~]# cat oldboyedu.txt
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
[root@oldboyedu ~]# cut -d":" -f3,4 /etc/passwd
0:0
1:1
2:2

[root@oldboyedu ~]# cat b.txt 
oldboy 49000448
[root@oldboyedu ~]# cut -c1-6,8- b.txt 
oldboy4900044




awk语法:
awk  [option]   'pattern{action}' file ...
awk   [参数]      '条件{动作}'    文件 ...

参数:
-F 指定分隔符
打印第一列:
[root@oldboyedu ~]# awk -F ":" '{print $1}' oldboyedu.txt 
root
bin
daemon
adm
lp

[root@oldboyedu ~]# awk -F ":" '{print $3,$5}' oldboyedu.txt 
0 root
1 bin
2 daemon
3 adm
4 lp

列:$1第一列 $2第二列 以此类推....
$0  整行
$NF 最后一列 倒数第一列
$(NF-1) 倒数第二列
[root@oldboyedu ~]# awk -F ":" '{print $NF}' oldboyedu.txt 
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
[root@oldboyedu ~]# awk -F ":" '{print $0}' oldboyedu.txt 
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


练习:打印 1 2 和最后一列。
[root@oldboyedu ~]# awk -F ":" '{print $1,$2,$NF}' oldboyedu.txt 
root x /bin/bash
bin x /sbin/nologin
daemon x /sbin/nologin
adm x /sbin/nologin
lp x /sbin/nologin

问题1:取test.txt文件的第2行到第3行的内容。
[root@oldboyedu ~]# awk 'NR>1&&NR<4' oldboyedu.txt 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@oldboyedu ~]# awk 'NR==2,NR==3' oldboyedu.txt 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin


问题2:过滤出含有root字符串的行※。
[root@oldboyedu ~]# awk '/root/' oldboyedu.txt
root:x:0:0:root:/root:/bin/bash
[root@oldboyedu ~]# awk /root/ oldboyedu.txt
root:x:0:0:root:/root:/bin/bash
[root@oldboyedu ~]# 
[root@oldboyedu ~]# awk "/root/" oldboyedu.txt
root:x:0:0:root:/root:/bin/bash

问题3:删除含有root字符串的行※。
[root@oldboyedu ~]# awk '/^[^r]/' oldboyedu.txt
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
[^r]  非r
^[^r] 以非r字符卡头

问题4:取文件的第一列、第三列和最后一列内容,并打印行号※。
[root@oldboyedu ~]# awk -F ":" '{print NR,$1,$3,$NF}' oldboyedu.txt 
1 root 0 /bin/bash
2 bin 1 /sbin/nologin
3 daemon 2 /sbin/nologin
4 adm 3 /sbin/nologin
5 lp 4 /sbin/nologin

问题5:取出Linux中执行ifconfig eth0后对应的IP地址(只能输出IP地址)。
[root@oldboyedu ~]# ifconfig eth0|awk 'NR==2{print $2}'
10.0.0.201

C6
[root@oldboy ~]# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:0C:29:D0:87:20  
          inet addr:10.0.0.202  Bcast:10.0.0.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fed0:8720/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:243 errors:0 dropped:0 overruns:0 frame:0
          TX packets:67 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:20674 (20.1 KiB)  TX bytes:8706 (8.5 KiB)

[root@oldboy ~]# ifconfig eth0|awk 'NR==2{print $2}'
addr:10.0.0.202
[root@oldboy ~]# ifconfig eth0|awk 'NR==2{print $2}'|awk -F ":" '{print $2}'
10.0.0.202

[root@oldboy ~]# ifconfig eth0|awk -F "[: ]+" 'NR==2{print $4}'
10.0.0.202

问题6:过滤文件中第一列内容匹配root的字符串,把符合的行的最后一列输出

awk -F ":" '$1~/root/ {print $NF}' test.txt 
~匹配

问题1:取test.txt文件的第2行到第3行的内容。
问题2:过滤出含有root字符串的行※。
问题3:删除含有root字符串的行※。
问题4:取文件的第一列、第三列和最后一列内容,并打印行号※。
问题5:取出Linux中执行ifconfig eth0后对应的IP地址(只能输出IP地址)。
问题6:过滤文件中第一列内容匹配root的字符串,把符合的行的最后一列输出
问题7:过滤下列test1.txt文件中第三列内容分数大于70,并且小于95的人名和性别。

相关文章

网友评论

      本文标题:linux基础day10

      本文链接:https://www.haomeiwen.com/subject/ojhvdctx.html