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