linux老男孩 基础部分章节07-----操作系统正则符号说明

 

1. 系统特殊符号

 1) 基础符号系列

美元符号:$

  • 用于取出变量中的内容
  • 用于取出指定列的信息(awk)
  • 表示用户命令提示符号--普通用户为 $--超级用户为 #
  • 一行的结尾
[root@xue/home/xuezy]# cat ./test.txt
hello world alex
hello world alex
hello world alex 

[root@xue/home/xuezy]# grep alex ./test.txt 
hello world alex
hello world alex
hello world alex 

[root@xue/home/xuezy]# awk '/alex/' ./test.txt
hello world alex
hello world alex
hello world alex 

[root@xue/home/xuezy]# awk '{print $3}' ./test.txt
alex
alex
alex

叹号符号: !  取反

  • 用于表示取反或者排除意思
  • 命令行中表示取出最近命令--!awk(慎用)--history|grep awk
  • 用于表示强制操作处理--vim底行模式保存 退出 wq! q!
[root@xue/home/xuezy]# grep linux ./test.txt
linux
[root@xue/home/xuezy]# grep alex ./test.txt
hello world alex
hello world alex
hello world alex 
[root@xue/home/xuezy]# grep -v linux  ./test.txt
hello world alex
hello world alex
hello world alex 

竖线符号: |

  • 表示管道符号,管道前面命令,交给管道后面执行
  • 经常配合xargs命令使用

                    xargs  命令|xargs 命令
                    xargs: 将信息进行分组显示

       补充: 如何忽略别名功能:
       01. 使用命令的绝对路径
       02. 在命令执行前加撬棍
       03. 在xargs信息后面命令自动忽略别名    

查找指定数据信息进行删除

find ./ -type f -name "*.txt" | xargs rm
find ./ -type f -name "*.txt" -exec rm -rf {} \
find ./ -type f -name "*.txt" -delete

查找指定数据信息进行复制  查找出*.txt文件,批量复制到/tmp目录

01. 将找到的信息放到cp 和 最终目录中间
    find /oldboy -type f -name "*.txt"|xargs -i cp {} /oldgirl   
    -i [replace-str], --replace[=replace-str]
    如果指定了replace-str,则此选项是-I replace-str的同义词。如果缺少replace-str参数,则效果与-I{}相同。此选项无效已弃用;请改用-I。
 02. 利用cp指明谁是数据最终保存的目录信息
     find /oldboy -type f -name "*.txt"|xargs  cp -t /oldgirl    
     -t, --target-directory=DIRECTORY
     copy all SOURCE arguments into DIRECTORY   
03.
find /oldboy -type f -name "*.txt" -exec cp -a {} /oldgirl \;

查找指定数据信息进行移动  查找出*.txt文件,批量移动到/tmp目录

01. 将找到的信息放到cp 和 最终目录中间
    find /oldboy -type f -name "*.txt"|xargs -i mv {} /oldgirl   
02. 利用cp指明谁是数据最终保存的目录信息
    find /oldboy -type f -name "*.txt"|xargs mv -t /oldgirl

井号符号: #

  • 表示文件内容注释符号
  • 表示用户命令提示符号--超级用户为 #

2) 引号符号系列   

美元括号$()

表示命令执行结果留下,用于其他命令调用

反引号` ` 

表示命令执行结果留下,用于其他命令调用


一个命令出自哪个文件包

[root@xue/home/xuezy]# rpm -qf `which ntpdate`
ntpdate-4.2.6p5-29.el7.centos.2.x86_64

拆解步骤:
[root@xue/home/xuezy]# which ntpdate 
/usr/sbin/ntpdate
[root@xue/home/xuezy]# rpm -qf /usr/sbin/ntpdate 
ntpdate-4.2.6p5-29.el7.centos.2.x86_64

单引号'  '

表示输入内容,就是输出内容(所见即所得)

双引号" "

表示输入内容,就是输出内容,但是部分信息会被解析

[root@xue/home/xuezy]# echo oldboy
oldboy
[root@xue/home/xuezy]# echo 'oldboy'
oldboy
[root@xue/home/xuezy]# echo "oldboy"
oldboy

#对比:
[root@xue/home/xuezy]# oldgirl=123 
[root@xue/home/xuezy]# echo 'oldboy $LANG $oldgirl'
oldboy $LANG $oldgirl
[root@xue/home/xuezy]# echo "oldboy $LANG $oldgirl"
oldboy en_US.UTF-8 123
[root@xue/home/xuezy]# echo oldboy $LANG $oldgirl
oldboy en_US.UTF-8 123

没有引号

和双引号功能类似 但是可以直接识别通配符信息

[xuezy@xue~]$ echo  {01..10}
01 02 03 04 05 06 07 08 09 10
[xuezy@xue~]$ echo  "{01..10}"
{01..10}

3) 重定向符号

       > / 1>    标准输出重定向符号
       2>      错误输出重定向符号
       >> / 1>   标准输出追加重定向符号
       2>>     错误输出追加重定向符号

       
如何将正确信息和错误信息都输出到文件中:(日志文件)

[root@xue/home/xuezy]# echo message > test.txt
[root@xue/home/xuezy]# cat test.txt
message
[root@xue/home/xuezy]# ech bug message 2> test.txt
[root@xue/home/xuezy]# cat test.txt
bash: ech: command not found


[root@xue/home/xuezy]# echo message and bud message 1> test.txt 2>test.txt
[root@xue/home/xuezy]# cat test.txt
message and bud message

[root@xue/home/xuezy]# ech message and bud message 1> test.txt 2>test.txt
[root@xue/home/xuezy]# cat test.txt
bash: ech: command not found

方法一: 将正确和错误信息同时保留到一个文件

[root@xue/home/xuezy]# echo oldboy >>./test.log  2>>./test.log
[root@xue/home/xuezy]# eho oldboy >>./test.log  2>>./test.log
[root@xue/home/xuezy]# cat ./test.log
oldboy
bash: eho: command not found

方法二: 将正确和错误信息同时保留到一个文件

[root@xue/home/xuezy]# echo oldgirl 1>./test.log 2>&1 
[root@xue/home/xuezy]# cat ./test.log
oldgirl
[root@xue/home/xuezy]# ech oldgirl 1>./test.log 2>&1 
[root@xue/home/xuezy]# cat ./test.log
bash: ech: command not found

#把所有标准输出和标准出错都扔到垃圾桶里。最后一个& 是让该命令在后台执行。
标准错误输出 重定向 到标准输出

方法三: 将正确和错误信息同时保留到一个文件

[root@xue/home/xuezy]# echo oldboy &> ./test.log
[root@xue/home/xuezy]# cat ./test.log
oldboy
[root@xue/home/xuezy]# ech  oldboy &> ./test.log
[root@xue/home/xuezy]# cat ./test.log
bash: ech: command not found

       <    标准输入重定向符号

[xuezy@xue~]$ tr "oldboy" "python" < test.txt     
oython01       # o -> o
oytgiry01      # l -> y
oyttog01       # d -> t
oython02       # b -> h
oytgiry02      # y -> n

[xuezy@xue~]$ cat test.txt 
hello 
this
is
a
txt
[xuezy@xue~]$ xargs < ./test.txt
hello this is a txt

<<   标准输入追加重定向符号

[root@xue/home/xuezy]# cat ./test.txt
bash: ech: command not found
[root@xue/home/xuezy]# cat >> ./test.txt << EOF
> hello
> world
> EOF
[root@xue/home/xuezy]# cat ./test.txt
bash: ech: command not found
hello
world

4) 路径信息系列

../  上一级目录
./   当前路径
~    返回到家目录--超级用户:/root--普通用户:/home/用户名称
-    两个目录之间进行快速切换

[root@xue/home/xuezy]# cd /tmp
[root@xue/tmp]# cd -
/home/xuezy
[root@xue/home/xuezy]# cd -
/tmp

An argument of - is equivalent to $OLDPWD(环境变量)
补充说明:

[root@xue/tmp]# cd $OLDPWD
[root@xue/home/xuezy]# cd $OLDPWD

[root@xue/tmp]# echo $OLDPWD
/home/xuezy

5) 逻辑符号系列

&&  与逻辑符号  

前一个命令执行成功, 再执行后面的命令
 

||  或逻辑符号  

前一个命令执行失败, 再执行后面的命令
       
   &&符号实践操作:

# 需求: 想创建一个/alex目录, 在目录中创建一个oldboy.txt 一条命令搞定
[root@xue/home/xuezy]# mkdi ./alex; touch ./alex/test.txt
bash: mkdi: command not found
touch: cannot touch ‘./alex/test.txt’: No such file or directory
[root@xue/home/xuezy]# mkdi ./alex &&  touch ./alex/test.txt
bash: mkdi: command not found
[root@xue/home/xuezy]# mkdir  ./alex &&  touch ./alex/test.txt
[root@xue/home/xuezy]# ll ./alex/test.txt
-rw-r--r--. 1 root root 0 Apr  1 15:47 ./alex/test.txt

  ||符号实践操作

# 需求: /alex/oldboy.txt删除失败了,在/alex/error.txt文件中生成失败信息
[root@xue/home/xuezy]# rmx ./alex/test.txt || echo "filed" >> ./alex/error.txt
bash: rmx: command not found
[root@xue/home/xuezy]# cat ./alex/error.txt 
filed
[root@xue/home/xuezy]# rm ./alex/test.txt || echo "filed" >> ./alex/error.txt
rm: remove regular empty file ‘./alex/test.txt’? y
[root@xue/home/xuezy]# cat ./alex/error.txt 
filed


 mkdir /oldboy && touch /oldboy/oldboy.txt || echo "目录已经存在,无须创建"

2. 系统通配符号

方便匹配找出多个数据文件(按照文件名称进行匹配查找)-----利用通配符号匹配文件名称信息
 

星号:*

模糊匹配所有内容 

# 找出以什么结尾的文件信息
find /oldboy -type f -name "*.txt"

# 找出以什么开头的文件信息
find /oldboy -type f -name "oldboy*"

花括号:{} 

  • 生成序列信息 (生成一行序列)

       生成连续序列
       生成不连续序列
       echo {1..10..2}  奇数序列
       echo {2..10..2}  奇数序列

[root@xue/home/xuezy]# echo {01..10}
01 02 03 04 05 06 07 08 09 10
[root@xue/home/xuezy]# echo {01,03,05}
01 03 05
[root@xue/home/xuezy]# echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@xue/home/xuezy]# echo {a,d,f..z}
a d f..z
[root@xue/home/xuezy]# echo {a,d,{f..z}}
a d f g h i j k l m n o p q r s t u v w x y z


[root@xue/home/xuezy]# echo {1..10..2}
1 3 5 7 9
[root@xue/home/xuezy]# echo {2..10..2}
2 4 6 8 10

  •   生成组合序列
[root@xue/home/xuezy]# echo {a..c}{1..3}
a1 a2 a3 b1 b2 b3 c1 c2 c3
[root@xue/home/xuezy]# echo A{01,02}
A01 A02
[root@xue/home/xuezy]# echo A{,02}
A A02

快速备份文件数据方法

[root@oldboyedu tmp]# # cp   /oldboy/oldboy.txt    /oldboy/oldboy.txt.bak
[root@oldboyedu tmp]# echo /oldboy/oldboy.txt{,.bak}
    /oldboy/oldboy.txt /oldboy/oldboy.txt.bak
[root@oldboyedu tmp]# cp /oldboy/oldboy.txt{,.bak}   --最终命令

# 测试题:
01. 在/oldboy目录中创建alex.txt文件,并在/oldboy目录中生成alex.txt.ori备份文件

       mkdir /oldboy 
       touch alex.txt 
       cp /oldboy/alex.txt{,.ori}

02. 如何将备份文件快速还原

       rm /oldboy/alex.txt -f 
       mv /oldboy/alex.txt{.ori,}
       快速还原
       mv /oldboy/alex.txt.ori /oldboy/alex.txt

3. 正则符号

1. 利用正则符号匹配文件内容信息
2. 正则符号经常出现在各种开发语言中, python java php 
3. 正则符号经常被三剑客命令使用

正则符号注意事项

  • ①. 按照每行信息进行过滤处理
  • ②. 注意正则表达符号禁止中文
  • ③. 附上颜色信息进行正则过滤  --color=auto
[xuezy@xue~]$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

基础正则表达式(basic regular expression) BRE

1. 尖角符号:^

  以什么开头的信息 

[root@xue/home/xuezy]# ll ./ | grep "^d"
drwxr-xr-x.  2 root  root    23 Apr  1 15:51 alex
drwxrwxr-x. 12 xuezy xuezy  166 Mar 21 15:32 test1
drwx--x--x.  2 xuezy xuezy    6 Mar 21 15:32 test2
drwxrwxr-x.  2 xuezy xuezy    6 Feb  7 10:24 test4
drwxr--r--.  2 xuezy root     6 Feb  1 10:10 testing
drwxr-xr-x.  2 root  root     6 Mar 30 11:13 tt

  2. 美元符号:$

以什么结尾的信息

[root@xue/home/xuezy]# ll -F  ./ | grep  /$
drwxr-xr-x.  2 root  root    23 Apr  1 15:51 alex/
drwxrwxr-x. 12 xuezy xuezy  166 Mar 21 15:32 test1/
drwx--x--x.  2 xuezy xuezy    6 Mar 21 15:32 test2/
drwxrwxr-x.  2 xuezy xuezy    6 Feb  7 10:24 test4/
drwxr--r--.  2 xuezy root     6 Feb  1 10:10 testing/
drwxr-xr-x.  2 root  root     6 Mar 30 11:13 tt/

 3. 尖号美元:^$

空行符号     

创建测试环境:

   cat >>/oldboy/oldboy.txt<<EOF
    # oldboyedu-sz-01
    oldboy-linux
    oldboy-python-linux
    
    # oldboyedu-sh
    oldboy-linux
    oldboy-python-linux
    
    # oldboyedu-bj
    oldboy-linux
    java
    mysql
    go
    python
    EOF

 01. 将以oldboy开头的行找出来

[root@xue/home/xuezy]# grep "^oldboy"./test.txt
[root@xue/home/xuezy]# sed -n '/^old/p' ./test.txt
oldboy-linux
oldboy-python-linux
oldboy-linux
oldboy-linux-linux
oldboy-linux

p是打印的意思。输出之后,是全部的输出,所以要加一个参数-n 

[root@xue/home/xuezy]# awk '/^old/'  ./test.txt
oldboy-linux
oldboy-python-linux
oldboy-linux
oldboy-linux-linux
oldboy-linux

02. 将以linux结尾的行找出来

[root@xue/home/xuezy]# grep "linux$" ./test.txt

 03. 将全部内容显示,但不要显示空行

[root@xue/home/xuezy]# vim ./test.txt^C
[root@xue/home/xuezy]# 
[root@xue/home/xuezy]# 
[root@xue/home/xuezy]# grep -v  "^$" ./test.txt

4.点符号 .  

匹配任意一个字符,且只有一个字符

环境准备

[root@xue/home/xuezy]# cat >> ./test.txt <<EOF
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!
my god ,i am not oldboey,but OLDBOY!
EOF

命令执行结果:

[root@xue/home/xuezy]# grep "." ./test.txt


显示匹配过程:

[root@xue/home/xuezy]# grep -o "." ./test.txt 
I
 
a
m
 
o

 5.星符号 *

匹配前一个字符连续出现了0次或者多次

[root@xue/home/xuezy]# grep "0*" ./test.txt 
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!
my god ,i am not oldboey,but OLDBOY!


前一个字符是0,所以匹配的是0这个字符
出现了0次或者多次。所以没有0的行也被匹配了。
[root@xue/home/xuezy]# grep "01*" ./test.txt 
my qq num is 49000448.
not 4900000448.


这次的结果是因为,先匹配0。找到所有的0,再看1的个数,为0次的或者多个的。

[root@xue/home/xuezy]# grep "01*" ./test.txt -o
0
0
0
0
0
0
0
0
如果不太理解,在原来的文件中再几个01010101;

[root@xue/home/xuezy]# cat ./test.txt
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!
01010101 
0111
111101
11110
my god ,i am not oldboey,but OLDBOY!
[root@xue/home/xuezy]# grep "01*" ./test.txt 
my qq num is 49000448.
not 4900000448.
01010101 
0111
111101
11110
[root@xue/home/xuezy]# grep "01*" ./test.txt -o
0
0
0
0
0
0
0
0
01
01
01
01
0111
01
0
[root@xue/home/xuezy]# 先是找到0,再看1的个数。

6.点和星结合: .*

匹配任意所有信息(包含空行)

[root@xue/home/xuezy]# grep "^m.*m$" ./test.txt 
my blog is http://oldboy.blog.51cto.com

问题: 贪婪匹配问题:

[root@xue/home/xuezy]# grep "^m.*o" ./test.txt
my blog is http://oldboy.blog.51cto.com
my god ,i am not oldbey,but OLDBOY!
my god ,i am not oldboey,but OLDBOY!
[root@xue/home/xuezy]# grep "^m.*o" ./test.txt  -o
my blog is http://oldboy.blog.51cto.co
my god ,i am not o
my god ,i am not oldbo

 指定具体信息阻止贪婪匹配

[root@xue/home/xuezy]# grep "^m.*og " ./test.txt
my blog is http://oldboy.blog.51cto.com
[root@xue/home/xuezy]# grep "^m.* blog " ./test.txt
my blog is http://oldboy.blog.51cto.com

[root@xue/home/xuezy]# grep "^m.*to" ./test.txt
my blog is http://oldboy.blog.51cto.com

7.转义符号: \

\作用:
  01. 将有特殊意义符号,转义成普通信息进行识别
  02. 将没有意义的信息转义为有特殊意义的信息

  • \n   换行符号
  • \t   制表符号
  • \r   表示匹配一个换行符号
将文件中的以 . 结尾的信息进行过滤:

[root@xue/home/xuezy]# grep "\.$" ./test.txt
I teach linux.
my qq num is 49000448.
not 4900000448.

  

换行符号作用:

[root@xue/home/xuezy]# echo "oldboy01\noldboy02\n"
oldboy01\noldboy02\n
[root@xue/home/xuezy]# echo -e "oldboy01\noldboy02\n"
oldboy01
oldboy02

8.括号符号:[ ]

匹配多个字符信息----表示包含括号中信息的

  • [abc]表示匹配包含a或b或c信息的字符
  • ^[abc]表示匹配包含a或b或c信息的字符开头的信息
  • [a-zA-Z0-9]找出所有以小写字母大写字母和数字信息的字符
  • [a-Z]找出所有以小写字母或大写字母组成字符(只能grep/egrep使用)
  • ^[a-z].*[.!]$表示以小写字母开头并且以点或叹号结尾的信息过滤出来
[root@xue/home/xuezy]# grep "oldb[oe]y" ./test.txt
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
my god ,i am not oldbey,but OLDBOY!

既能匹配oldboy  也能匹配oldbey

[root@xue/home/xuezy]# grep "^[mo]" ./test.txt
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
my god ,i am not oldbey,but OLDBOY!
my god ,i am not oldboey,but OLDBOY!

匹配出 m o开头的行

 找出文件中除了注释的行

[root@xue/home/xuezy]# grep "^[a-Z]" /etc/selinux/config
SELINUX=enforcing
SELINUXTYPE=targeted 
[root@xue/home/xuezy]# grep -v "^#" /etc/selinux/config

SELINUX=enforcing
SELINUXTYPE=targeted 


效果相同

9.括号和尖号组合 [^]

排除符号

  • [^abc]:表示排除包含a或b或c信息的字符
  • ^[^abc]:表示排除包含a或b或c信息的字符开头的行(不包含空行)

扩展正则表达式(extended regular expression)ERE

扩展正则符号:

    默认 grep sed不能直接识别

    grep 提升自己  -- egrep/grep -E 

    sed  提升自己  -- sed -r 

1.+号符号

表示前一个字符连续出现了1次或多次以上

补充总结说明:一般加号符号经常是与中括号使用,可以匹配出多个不同的连续字符

[root@xue/home/xuezy]# grep "0*" ./test.txt
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!
01010101 
0111
111101
11110
my god ,i am not oldboey,but OLDBOY!
[root@xue/home/xuezy]# grep "0+" ./test.txt     #表示取出数字0字符,以及连续的多个数字0字符
[root@xue/home/xuezy]# grep -E "0+" ./test.txt
my qq num is 49000448.
not 4900000448.
01010101 
0111
111101
11110
[root@xue/home/xuezy]# egrep "0+" ./test.txt
my qq num is 49000448.
not 4900000448.
01010101 
0111
111101
11110
[root@xue/home/xuezy]# egrep "[a-z]+" ./test.txt
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!
my god ,i am not oldboey,but OLDBOY!


表示取出文件中的所有连续的小写字母(其实是取出单词信息)

测试环境:

[root@xue/home/xuezy]# cat >> ./test02.txt << EOF
> 张三   110105199004067631
> 
>     李四   104105199004067631
> 
>     赵六   oldboy
> 
>     王五   104105199004067631
> EOF

找出身份证信息输入错误的内容

[root@xue/home/xuezy]# grep "[0-9]"  ./test02.txt
    张三   110105199004067631
    李四   104105199004067631
    王五   104105199004067631
[root@xue/home/xuezy]# grep "[0-9]+"  ./test02.txt
[root@xue/home/xuezy]# grep -E "[0-9]+"  ./test02.txt
    张三   110105199004067631
    李四   104105199004067631
    王五   104105199004067631
[root@xue/home/xuezy]# grep -Ev  "[0-9]+"  ./test02.txt
    赵六   oldboy

[root@xue/home/xuezy]# grep -E "[0-9]+"  ./test02.txt  |wc -c
105

2. 竖线符号:|  

    并且符号,用于匹配多个信息----表示匹配多个满足条件的信息(或者)

[root@xue/home/xuezy]# grep -E  "oldboy|oldbey" ./test.txt
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
my god ,i am not oldbey,but OLDBOY!
[root@xue/home/xuezy]# grep -E  "oldb[oe]y" ./test.txt
I am oldboy teacher!
my blog is http://oldboy.blog.51cto.com
my god ,i am not oldbey,but OLDBOY!

3.括号符号: ()

    作用:

    1. 指定信息进行整体匹配---表示匹配一个整体信息

 

  2. 进行后项引用前项使用: sed命令替换功能

[root@xue/home/xuezy]# echo oldboy{01..10}
oldboy01 oldboy02 oldboy03 oldboy04 oldboy05 oldboy06 oldboy07 oldboy08 oldboy09 oldboy10
[root@xue/home/xuezy]# echo oldboy{01..10} | xargs -n1
oldboy01
oldboy02
oldboy03
oldboy04
oldboy05
oldboy06
oldboy07
oldboy08
oldboy09
oldboy10
[root@xue/home/xuezy]# echo oldboy{01..10} | xargs -n1 |sed 's#(.*)#useradd \1#g'
    sed: -e expression #1, char 19: invalid reference \1 on `s' command's RHS
    xargs: echo: terminated by signal 13
[root@oldboyedu ~]# echo oldboy{01..10}|xargs -n1|sed -r 's#(.*)#useradd \1#g'
    useradd oldboy01
    useradd oldboy02
    useradd oldboy03
    useradd oldboy04
    useradd oldboy05
    useradd oldboy06
    useradd oldboy07
    useradd oldboy08
    useradd oldboy09
    useradd oldboy10

[root@oldboyedu ~]# echo oldboy{01..10}|xargs -n1|sed -r 's#(.*)#useradd \1#g'|bash

    useradd: user 'oldboy02' already exists
    useradd: user 'oldboy03' already exists
    useradd: user 'oldboy04' already exists
    useradd: user 'oldboy05' already exists
    useradd: user 'oldboy06' already exists
    useradd: user 'oldboy07' already exists
    useradd: user 'oldboy08' already exists
    useradd: user 'oldboy09' already exists
    useradd: user 'oldboy10' already exists

企业面试题

批量创建用户 oldboy01..oldboy10,并给每个用户设置密码信息,默认初始化密码(123456)

    01. 如何创建用户 给用户设置密码

    02. 基础命令 echo {}/seq -w 10

    03. sed命令替换信息方法

    04. 正则符号 .* () 

    05. 基础符号 ; |

    06. bash内置命令

    [root@oldboyedu ~]# seq -w 10|sed -r 's#(.*)#useradd oldboy\1;echo 123456|passwd --stdin oldboy\1#g'

    useradd oldboy01;echo 123456|passwd --stdin oldboy01
    useradd oldboy02;echo 123456|passwd --stdin oldboy02
    useradd oldboy03;echo 123456|passwd --stdin oldboy03
    useradd oldboy04;echo 123456|passwd --stdin oldboy04
    useradd oldboy05;echo 123456|passwd --stdin oldboy05
    useradd oldboy06;echo 123456|passwd --stdin oldboy06
    useradd oldboy07;echo 123456|passwd --stdin oldboy07
    useradd oldboy08;echo 123456|passwd --stdin oldboy08
    useradd oldboy09;echo 123456|passwd --stdin oldboy09
    useradd oldboy10;echo 123456|passwd --stdin oldboy10

将输出的信息

echo 123456 ==> 转换为 <123456>进行显示

[root@xue/home/xuezy]# # echo 123456 ==> 转换为 <123456>进行显示
[root@xue/home/xuezy]# echo 123456 | sed -r 's#([1-6]+)#<\1>#g'
<123456>
[root@xue/home/xuezy]# echo 123456 | sed -r 's#(.*)#<\1>#g'
<123456>
[root@xue/home/xuezy]# echo 123456 | sed -r "s#(.*)#<\1>#g"
<123456>

 echo 123456 ==> 转换为 <12><34><56>进行显示

[root@xue/home/xuezy]#  # echo 123456 ==> 转换为 <12><34><56>进行显示
[root@xue/home/xuezy]# echo 123456 | sed 's#(12)(34)(56)#<\1><\1><\1>#g'
sed: -e expression #1, char 29: invalid reference \1 on `s' command's RHS
[root@xue/home/xuezy]# echo 123456 | sed -r 's#(12)(34)(56)#<\1><\1><\1>#g'
<12><12><12>
[root@xue/home/xuezy]# echo 123456 | sed -r 's#(12)(34)(56)#<\1><\2><\3>#g'
<12><34><56>
[root@xue/home/xuezy]# echo 123456 | sed -r 's#(..)(..)(..)#<\1><\2><\3>#g'
<12><34><56>

echo 123456 ==> 转换为 <12>34<56>进行显示  

[root@xue/home/xuezy]# echo 123456 | sed -r 's#(..)(..)(..)#<\1>\2<\3>#g'
<12>34<56>

4. 括号符号:{}

    可以指定字符连续匹配的次数

    第一种情况: x{n,m}  表示前一个字符至少连续出现n次,最多出现m次

[root@xue/home/xuezy]# cat ./test.txt
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!
my god ,i am not oldboey,but OLDBOY!

[root@xue/home/xuezy]# grep -E "0+" ./test.txt
my qq num is 49000448.
not 4900000448.
[root@xue/home/xuezy]# grep -E "0{2,3}" ./test.txt
my qq num is 49000448.
not 4900000448.
[root@xue/home/xuezy]# grep -E "0{2,3}" ./test.txt -o
000
000
00
[root@xue/home/xuezy]# grep -E "0+" ./test.txt -o
000
00000

第二种情况: x{n} 表示前一个字符正好连续出现了n次

[root@xue/home/xuezy]# grep -E "0{2}" ./test.txt 
my qq num is 49000448.
not 4900000448.
[root@xue/home/xuezy]# grep -E "0{2}" ./test.txt -o
00
00
00

    

    第三种情况: x{n,} 表示前一个字符至少连续出现n次,最多出现多少次不限

[root@xue/home/xuezy]# grep -E "0{2,}" ./test.txt
my qq num is 49000448.
not 4900000448.
[root@xue/home/xuezy]# grep -E "0{2,}" ./test.txt -o
000
00000

    第四种情况: x{,m} 表示前一个字符至少连续出现0次,最多出现m次

[root@xue/home/xuezy]# grep -E "0{,2}" ./test.txt
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!
my god ,i am not oldboey,but OLDBOY!

[root@xue/home/xuezy]# grep -E "0{,2}" ./test.txt -o
00
0
00
00
0

  

5.问号符号 ?

 定义匹配前一个字符出现0或者1次

  •     总结:
  •     *  匹配前一个字符出现0次或者多次
  •     +  匹配前一个字符出现1次或者多次
  •     {} 匹配前一个字符指定出现多少次,至少0次
  •     ?  匹配前一个字符出现0次或者1次

 创建一个测试环境:

[root@xue/home/xuezy]# cat >> test03.txt << EOF
> gd
> god
> good
> goood
> gooood
> EOF
[root@xue/home/xuezy]# grep "o*" ./test03.txt
gd
god
good
goood
gooood
[root@xue/home/xuezy]# grep "o+" ./test03.txt
[root@xue/home/xuezy]# grep -E "o+" ./test03.txt
god
good
goood
gooood
[root@xue/home/xuezy]# grep -E "o?" ./test03.txt
gd
god
good
goood
gooood
[root@xue/home/xuezy]# grep -E "o+" ./test03.txt -o
o
oo
ooo
oooo
[root@xue/home/xuezy]# grep -E "o?" ./test03.txt -o
o
o
o
o
o
o
o
o
o
o

    补充: 想让grep sed命令可以直接识别扩展正则

    [root@oldboyedu ~]# grep "o\+" oldboy_test03.txt
    god
    good
    goood
    gooood
    [root@oldboyedu ~]# grep -E "0{,2}" oldboy_test.txt^C
    [root@oldboyedu ~]# echo 123456|sed  "s#\(..\)\(..\)\(..\)#<\1><\2><\3>#g"
    <12><34><56>

    利用ip address show eth0只把IP地址信息显示出来?

[xuezy@xue~]$ ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:b7:4e:3c brd ff:ff:ff:ff:ff:ff
    inet 192.168.144.20/24 brd 192.168.144.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::f64e:d691:b73a:6f2a/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[xuezy@xue~]$ ip a s eth0 | grep -E "[0-9]+.[0-9]+.[0-9]+.[0-9]+"
    inet 192.168.144.20/24 brd 192.168.144.255 scope global noprefixroute eth0
[xuezy@xue~]$ ip a s eth0 | grep -E "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+"
    inet 192.168.144.20/24 brd 192.168.144.255 scope global noprefixroute eth0
[xuezy@xue~]$ ip a s eth0 | grep -E "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" -o
192.168.144.20
192.168.144.255
[xuezy@xue~]$ ip a s eth0 | grep -E "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" -o |head -1
192.168.144.20

简化一下:

[xuezy@xue~]$ ip a s eth0 | grep -E "([0-9]+\.){3}([0-9]+)"
    inet 192.168.144.20/24 brd 192.168.144.255 scope global noprefixroute eth0
[xuezy@xue~]$ ip a s eth0 | grep -E "([0-9]+\.){3}([0-9]+)" -o
192.168.144.20
192.168.144.255

 

[xuezy@xue~]$ ip a s eth0 | grep -E "([0-9]+\.?){4}" 
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 192.168.144.20/24 brd 192.168.144.255 scope global noprefixroute eth0
[xuezy@xue~]$ ip a s eth0 | grep -E "([0-9]+\.?){4}" -o
1500
1000
192.168.144.20
192.168.144.255
[xuezy@xue~]$ ip a s eth0 | grep -E "([0-9]+\.?){4}" -o| head -3 |tail -1
192.168.144.20

 

[xuezy@xue~]$ hostname -i
fe80::f64e:d691:b73a:6f2a%eth0 192.168.144.20

4.正则符号使用问题

    学生问题:
    01. 文件中有\撬棍信息,如何进行过滤
    [root@oldboyedu ~]# grep '\\' oldboy_test.txt 
    I \teach \linux.
    02. 文件中有$符号, 是识别变量, 还是识别普通符号
    [root@oldboyedu ~]# grep '$oldgirl' oldboy_test.txt 
    $oldgirl
    [root@oldboyedu ~]# grep "\$oldgirl" oldboy_test.txt 
    $oldgirl

作业:

01. sed/awk命令如何进行排除过滤? grep -v     

02. 批量创建用户 oldboy01..oldboy10,并给每个用户设置随机密码信息

    07. shell

        1) 如何生成随机信息

        2) 变量设置

        3) 循环语句        

03. 取IP地址/取权限数值 利用grep/sed/awk + 正则符号

04. sed     

作业:

01. 利用linux什么命令真正统计目录的大小? 

    du -xxx     

       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值