目录
一、常见系统特殊符号
(一)基础符号系列
1)美元符号 $
2)叹号符号 !
3)竖线符号 |
4)井号符号 #
(二)引号符号系列
(三)定向符号系列
(四)路径符号系列
(五)逻辑符号系列
二、常见通配符号
(一)通配符号作用
(二)通配符号企业应用
三、find(以文件为单位进行查找后删除复制移动)
三、正则符号
(一)正则符号作用说明
(二)正则表达符号分类
(三)正则符号注意事项
(四)基础正则符号说明
(五)扩展正则符号说明
(六)正则符号使用问题
(七)正则符号特性说明
五、grep(过滤筛选信息)
六、sed(修改替换文件内容 擅长对文件中的行进行操作)
1)概念介绍
2)sed命令的执行流程
3)sed命令实际应用
七、awk(擅长统计分析文件内容 擅长对文件中列进行操作)
1)概念介绍
2)awk命令执行过程
3)awk命令的实际应用
1.用于取出变量中的内容
2.用于取出指定列的信息(awk)
3.表示用户命令提示符号
超级用户为 #
普通用户为 $
1.用于表示取反或者排除意思
2.命令行中表示取出最近命令
!awk(慎用)
history|grep awk
3.用于表示强制操作处理
vim底行模式保存 退出 wq! q!
1.表示管道符号,管道前面命令,交给管道后面执行
2.经常配合xargs命令使用
经常配合xargs命令使用
查找指定数据信息进行删除
find /test -type f -name "test*.txt"|xargs rm
find /test -type f -name "test*.txt" -exec rm -rf {} \;
find /test -type f -name "test*.txt" -delete
查找指定数据信息进行复制
find /test -type f -name "test*.txt" |xargs -i cp {} /test01/
find /test -type f -name "test*.txt" |xargs cp -t /test01/
find /test -type f -name "test*.txt" -exec cp -a {} /test01 \;
查找指定数据信息进行移动
find /test -type f -name "test*.txt" |xargs -i mv {} /test01/
find /test -type f -name "test*.txt" |xargs mv -t /test01/
find /test -type f -name "test*.txt" -exec mv {} /test01 \;
查找指定数据信息按照日期 --主要用于批量删除历史数据信息
查找7天以前的数据: find /test -type f -mtime +7
查找最近7天的数据: find /test -type f -mtime -7
查找距今第7天数据: find /test -type f -mtime 7
1.表示文件内容注释符号
2.表示用户命令提示符号
超级用户为 #
普通用户为 $
1.美元括号:
$()
表示命令执行结果留下,用于其他命令调用
2.引号符号:
双引号
""
表示输入内容,就是输出内容,但是部分信息会被解析
单引号
''
表示输入内容,就是输出内容(所见即所得)
反引号
``
表示命令执行结果留下,用于其他命令调用
1.小于符号:
单个小于符号
<
标准输入重定向符号
两个小于符号
<<
标准输入追加重定向符号
2.大于符号:
单个大于符号
>/2>
标准输出重定向符号
错误输出重定向符号
两个大于符号
>>/2>>
标准输出追加重定向符号
错误输出追加重定向符号
1.单点符号:
.
表示当前目录
2.双点符号:
..
表示上级目录
3.波浪符号
~
表示用户家目录信息
超级用户:/root
普通用户:/home/用户名称
1.并且符号:
&&
表示前面的名称执行成功,再执行后面的命令
2.或者符号:
||
表示前面的名称执行失败,再执行后面的命令
作用说明:查找文件名称信息
使用场景:命令行经常使用
通配符号作用说明:方便匹配找出多个数据文件(按照文件名称进行匹配查找)
通配符号企业应用(wildcard)
1.星号:*
表示匹配所有内容信息
# 找出以什么结尾的文件信息
find /test -type f -name "*.txt"
# 找出以什么开头的文件信息
find /test -type f -name "test*"
2.花括号:{}
表示生成序列信息
# 生成连续数字序列
echo {01..10}
# 生成不连续数字序列
echo {01,03,05}
# 生成连续字母序列
echo {a..d}
# 生成不连续字母序列
echo {a,d,f,h}
表示生成组合序列
# 生成组合序列
echo A{A,B}
# 生成组合序列
echo {A,B}{C,D}
# 生成备份文件
cp oldboy.txt{,.bak}
find:查找符合条件的文件
01、精确查找:
find 路径信息 -type 文件类型 -name "文件名"
02、模糊查找:
find 路径信息 -type 文件类型 -name "文件名*"
find 路径信息 -type 文件类型 -name "*文件名"
find 路径信息 -type 文件类型 -name "文*件名"
03、忽略字符大小写查找:
find 路径信息 -type 文件类型 -iname "文件名*"
04、根据数据大小查找数据:
find /test -type f -size +100 --找出大于100k的文件
find /test -type f -size -100 --找出小于100k的文件
find /test -type f -size +1M --找出大于1M的文件
`b' for 512-byte blocks (this is the default if no suffix is used)
`c' for bytes (推荐)
`w' for two-byte words
`k' for Kilobytes (units of 1024 bytes) (推荐)
`M' for Megabytes (units of 1048576 bytes) (推荐)
`G' for Gigabytes (units of 1073741824 bytes)
05、根据目录指定层级进行查找数据(进行递归查找):
find /test -maxdepth 1 -type f -name "test*"
06、实际应用:
01. 如何找出/test/目录中.txt结尾的文件,将找出的文件进行统一删除
a find /test/ -maxdepth 1 -type f -name "*.txt" -delete
b find /test/ -type f -name "*.txt" -exec rm -rf {} \;
c find /test/ -type f -name "*.txt" | xargs rm -f
d rm -rf $(find /test -type f -name "*.txt")
e rm -f `find /test/ -type f -name "*.txt"`
02.如何找出/test/目录中.txt结尾的文件,将找出的文件进行批量复制/移动到/tmp目录中
find /test/ -maxdepth 1 -type f -name "*.txt" -exec cp {} /tmp \;
find /test/ -maxdepth 1 -type f -name "*.txt" | xargs cp /tmp ---xargs其作用是将查找内容一列变为1行
补充:
1.查找指定数据信息进行删除
01.find /test -type f -name "test*.txt"|xargs rm
02.find /test -type f -name "test*.txt" -exec rm -rf {} \;
03.find /test -type f -name "test*.txt" -delete
2.查找指定数据信息进行复制
01.find /test -type f -name "test*.txt"|xargs -i cp {} /test01/
02.find /test -type f -name "test*.txt"|xargs cp -t /test01/
03.find /test -type f -name "test*.txt" -exec cp -a {} /test01 \;
3.查找指定数据信息进行移动
01.find /test -type f -name "test*.txt"|xargs -i mv {} /test01/
02.find /test -type f -name "test*.txt"|xargs mv -t /test01/
03.find /test -type f -name "test*.txt" -exec mv {} /test01 \;
4.查找指定数据信息按照日期(主要用于批量删除历史数据信息)
01.查找7天以前的数据:find /test -type f -mtime +7
02.查找最近7天的数据:find /test -type f -mtime -7
03.查找距今第7天数据:find /test -type f -mtime 7
作用说明:查找文件内容信息
使用场景:三剑客命令常用/各种语言经常使用
方便匹配找出文件中的内容信息
1.基础正则表达式(basic regular expression)
^ $ . * [] [^]
2.扩展正则表达式(extended regular expression)
| + () {} ?
①. 按照每行信息进行过滤处理
②. 注意正则表达符号禁止中文
③. 附上颜色信息进行正则过滤
--color=auto/--color
01.尖角符号:^
表示以什么字符开头的一行信息
02.美元符号:$
表示以什么字符结尾的一行信息
03.空行符号:^$
表示过滤空行信息
04.点号符号:.
表示匹配任意一个且只有一个字符
grep -o "." test.txt
-o:表示显示grep命令执行过程
05.星号符号:*
表示前一个字符出现0次或者多次
06.点星符号:.*
表示匹配文件中所有信息(包含空行)
^.*xxx
表示以任意字符开头xxx结尾(贪婪匹配)
^xxx.*xxx$
表示以xxx开头,xxx结尾的所有行
07.转移符号:\
表示还原字符的本来意思
'\.$'
表示查询出以点结尾的行信息
tr 源信息 替换后信息 <文件信息
表示对数据信息进行替换处理,采用一对一替换(sed命令的阉割版)
转移符号的常见用法汇总
\n
表示匹配一个换行符号
\r
表示匹配一个换行符号
\t
表示匹配一个制表符号
08.括号符号:[ ]
表示包含括号中信息的
[abc]
表示匹配包含a或b或c信息的字符
^[abc]
表示匹配包含a或b或c信息的字符开头的信息
[a-zA-Z0-9]
找出所有以小写字母大写字母和数字信息的字符
[a-Z]
找出所有以小写字母或大写字母组成字符(只能grep/egrep使用)
^[a-z].*[.!]$
表示以小写字母开头并且以点或叹号结尾的信息过滤出来
09.排除符号:[^]
表示排除括号中信息的
[^abc]
表示排除包含a或b或c信息的字符
^[^abc]
表示排除包含a或b或c信息的字符开头的行(不包含空行)
01.加号符号:+
表示前一个字符连续出现了1次或多次以上
egrep "0+" file
表示取出数字0字符,以及连续的多个数字0字符
egrep "[a-z]+" file
表示取出文件中的所有连续的小写字母(其实是取出单词信息)
补充总结说明
一般加号符号经常是与中括号使用,可以匹配出多个不同的连续字符
02.竖线符号:|
表示匹配多个满足条件的信息(或者)
03.括号符号:()
表示匹配一个整体信息
egrep “oldb(o|e)y" file
表示过滤指定整体信息
表示用于后项引用前项
sed -r 's#(.*)#<\1>#g'
利用sed命令实现后项引用前项
sed -r 's#([0-9]+)#<\1>#g'
利用sed命令实现后项引用前项
sed -r 's#(..)(...)(..)#<\1><\2>#g'
利用sed命令实现后项引用前项
04.括号符号:{}
表示定义前面字符出现次数
x{n,m}
表示前一个字符至少连续出现n次,最多出现m次
x{n}
表示前一个字符正好连续出现了n次
x{n,}
表示前一个字符至少连续出现n次,最多出现多少次不限
x{,m}
表示前一个字符至少连续出现0次,最多出现m次
05.问号符号:?
表示定义前面字符出现0次或1次
PS:扩展正则符号
默认grep sed 命令不能直接识别
grep 提升自己 egrep/grep -E
sed 提升自己 sed -r
①. 问题:尖角符号和星号符号区别?
^d和d*
②. 问题:星号符号匹配不存在信息?
grep ''
③. 问题:过滤时是否使用引号区别?
egrep [ab]{1,} oldboy.txt
①. 正则表达符号具有贪婪特性
②扩展正则转换 基础正则方法.
grep 'go\+d'
grep参数介绍
-A after 在什么后面
-B before 在什么前面
-C centre 在什么中间
-c 统计信息出现的次数
grep命令如何进行过滤
1.筛选出有test的信息
grep "test" test.txt --从test.txt文件中筛选出有test的信息
2.筛选出有test的信息,但要有test信息的上一行信息也显示
grep -B 1 "test" test.txt
3.筛选出有test的信息,但要有test信息的下一行信息也显示
grep -A 1 "test" test.txt
4.筛选出有test的信息,但要有test信息的上一行和下一行信息也显示
grep -C 1 "test" test.txt
5.统计test信息在文件中出现了几次
grep -c 1 "test" test.txt
官方概念:字符流过滤编辑和文本字符流转换工具
功能应用说明:
01.处理文本信息
文本文件信息(小文件)
日志文件信息(grep awk分析)
配置文件信息(sed)
02.处理文件方式
增加信息
删除信息
修改信息
查找信息
命令语法格式:
标准格式:sed [选项] [sed指令] [文件信息]
举例说明:sed -i.bak 's#test#test01#g' test.txt
sed命令参数信息:
-n 取消默认输出
-r 识别扩展正则
-i 真实编辑文件(将内存中的信息覆盖到磁盘中)
-e 识别sed命令多个操作指令
sed命令指令信息:
p print 输出信息
i insert 插入信息,在指定信息前面插入新的信息
a append 附加信息,在指定信息后面附加新的信息
d delete 删除指定信息
s substitute 替换信息 s###g(全局替换)
c 替换修改指定的一整行信息
指令修饰:g
PS:相同指令信息只能使用一次,想使用多次需要加上分号
1.sed查询信息
#01.根据文件内容的行号查询
sed -n '3p' person.txt --显示单行信息
sed -n '1,3p' person.txt --显示1-3行信息(连续)
sed -n '1p;3p' person.txt --显示第1、第3共两行(不连续)
#02.根据内容信息输出单行内容
sed -n '/test/p' person.txt --将含有test的行显示出来
sed -n '/test/,/Alex/p' person.txt --显示包含test到Alex行之间的所有行信息(连续)
sed -n '/test/p;/Alex/p' person.txt --只显示包含test、Alex的行
2.sed命令增加信息(i:行前、a:行后)
sed '1iHelloworld' test.txt --在文件最前面增加一行Helloworld
sed '$abaibai' test.txt --在文件最后面增加一行baibai
sed '3afour' test.txt --在第三行后面增加一行four
sed '2itwo' test.txt --在第二行前面增加一行two
sed -e '/test/iqian' -e '/test/ahou' test.txt --在包含test行的前天增加一行qian,后面增加一行hou
sed '$a100\n101' test.txt --增加多行信息
企业中编写配置文件:
IPaddress=10.10.10.1
mask=255.255.255.0
gateway=10.10.10.254
sed '$aIPaddress=10.10.10.1\nmask=255.255.255.0\ngateway=10.10.10.254' 文件名称
3.sed命令删除信息
sed '3d' test.txt --删除第3行(单行)
sed '2,6d' test.txt --删除第2-6行(连续行)
sed '3d;6d' test.txt --删除第3行和第6行
如何利用sed命令取消空行显示?
sed -n '/./p' test.txt
sed '/^$/d' test.txt
sed -n '/^$/!p' test.txt
4.sed命令修改信息
vim 替换: :%s#one#two#g
sed 's#要修改的内容#修改后的内容#g' test.txt
sed 's#one#two#g'
sed 's/#one/two/g' test.txt
后项引用前项进行替换修改
sed 's#()#\n#g' test.txt
ip a s eth0|sed -rn '3s#^.*net(.*)/24.*#\1#gp' --取出IP地址
sed -i.bak 's#one#two#g' test.txt --修改文件内容并自动备份
PS:在真实替换文件内容时候,一定不能让n和i参数同时出现
ni和参数同时使用,会将文件内容进行清空
测验替换功能:
创建测试环境:
-rw-r--r-- 1 root root 0 Jun 7 19:43 test00.txt
-rw-r--r-- 1 root root 0 Jun 7 19:43 test01.txt
-rw-r--r-- 1 root root 0 Jun 7 19:43 test02.txt
-rw-r--r-- 1 root root 0 Jun 7 19:43 test03.txt
批量修改文件的扩展名称 将testxx.txt扩展名修改为testxx.jpg
ls test*.txt|sed -r 's#(.*)txt#mv & \1jpg#g'
mv test00.txt test00.jpg
mv test01.txt test01.jpg
mv test02.txt test02.jpg
mv test03.txt test03.jpg
批量重命名专业命令: rename
rename .txt .jpg test*.txt
命令 文件名称需要修改的部分信息 修改成什么信息 将什么样的文件进行修改
处理文件信息:
1.文本文件信息
2.日志文件信息
3.配置文件信息
处理文件方式:
1. 排除信息
2. 查询信息
3. 统计信息
4. 替换信息
语法格式:
sed [参数] '条件-处理方式' 文件
awk [选项] '模式{动作}' [文件信息]
内置变量
FS:field separator -F ":" == BEGIN{FS=":"} == -vFS=":" 字段分隔符变量
NR:number records --表示行号信息
NF:number of fields --表示每一行有多少列(默认表示总列数)
一、awk的实际操作过程
测试环境:
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
1.awk查询信息
#01.按照行号查询
awk 'NR==2' test.txt --显示第2行信息
awk 'NR==2,NR==4' test.txt --显示第2-4行信息
awk 'NR==2;NR==4' test.txt --显示第2行和第4行信息
PS:在linux中
test=10 --赋值变量信息
test==10 --test等于10
#02.按照字符查询
awk '/one/' test.txt --显示含有字符one的行
awk '/one/,/three/' test.txt --显示含有字符one的行到含有three字符的行之间的所有行
awk '/one/;/three/' test.txt --显示含有字符one的行和含有字符three字符的行
显示xiaoyu的姓氏和ID号码
awk '/Xiaoyu/{print $1,$3}' test.txt
姓氏是zhang的人,显示他的第二次捐款金额及他的名字
awk '/Zhang/{print $NF}' test.txt|awk -F ":" '{print $3}' -F:指定分隔符
awk -F ":" '/^Zhang/{print $3}' test.txt
awk -F "[ :]+" '/^Zhang/{print $1,$2,$(NF-1)}' test.txt --以空格和冒号为分隔符
#03.显示所有以41开头的ID号码的人的全名和ID号码
awk '$3~/^41/{print $1,$2,$3}' test.txt --找出第三列以41开头的所有行,输出该行的1,2,3列信息
#04. 显示所有ID号码最后一位数字是1或5的人的全名
方法一:
awk '$3~/1$|5$/{print $1,$2}' test.txt|column -t ##column -t 以表格形式显示(整齐)
方法二:
awk '$3~/[15]$/{print $1,$2}' awk_test.txt|column -t
方法三:
awk '$3~/(1|5)$/{print $1,$2}' awk_test.txt|column -t
05. 显示Xiaoyu的捐款,每个捐款数值前面都有以$开头, 如$110$220$330
#gsub(/需要替换的信息/,"修改成什么信息",将哪列信息进行修改)
awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' test.txt --找出第4列含有Xiaoyu的所有行,将最后一列的分隔符:替换为$并输出最后一列
文件中空行进行排除/文件中注释信息进行排除
grep -Ev "^#|^$" 文件信息
sed -n '/^#|^$/!p' 文件信息
awk '/^#|^$/' 文件信息
如何利用awk取出IP地址信息:
ip a s eth0|awk -F "[ /]+" 'NR==3{print $6}' --将以连续空格或/为分隔符,取出第3行的第6列
hostname -i
二、awk高级功能说明
普通的模式:
01. 正则表达式作为模式
awk '/^oldboy/{print xx}'
02. 利用比较匹配信息
NR==2
NR>=2
NR<=2
03. NR==2,NR==10
特殊的模式
01.BEGIN{} 在awk执行命令前做什么事情:
awk 'BEGIN{print "姓","名","QQ号","捐款记录"}{print $0}' test.txt |column -t
姓 名 QQ号 捐款记录
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
...
修改内置分隔符变量
awk -F ":" '{print $2}' test.txt
awk 'BEGIN{FS=":"}{print $2}' test.txt
02.END{} 在awk执行命令结束之后做的操作
awk 'BEGIN{print "姓","名","QQ号","捐款记录"}{print $0}END{print "操作结束"}' test.txt |column -t
姓 名 QQ号 捐款记录
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
...
操作结束
统计累加运算测试:
01. 统计/etc/services文件中空行数量
利用awk公式进行累加运算
awk '/^$/{i=i+1;print i}' /etc/services
awk '/^$/{i=i+1}END{print i}' /etc/services --输出最终多少行
02. 统计/etc/services文件中有井号开头的行
awk '/^#/{i++}END{print i}' /etc/services
03. 统计系统中有多少个虚拟用户 普通用户
第一个历程: 用户信息都保存在什么文件中了
用户信息保存文件: /etc/passwd
第二个历程: 从文件中匹配出虚拟用户 普通用户
匹配普通用户
awk '$NF~/bash/' /etc/passwd
awk '$NF~/\/bin\/bash/' /etc/passwd
第三个历程: 进行统计
普通用户数量
awk '$NF~/bash/{i=i+1}END{print i}' /etc/passwd --统计最后一列含有bash的所有行
63
虚拟用户数量
awk '$NF!~/bash/{i=i+1}END{print i}' /etc/passwd --统计最后一列不含bash的所有行
22
求和运算:
sum=sum+$n(需要进行数值求和的列)
seq 10|awk '{sum=sum+$1;print sum}'
总结:awk命令中$符号用法
$1 $2 $3 : 取第几列信息
$NF : 取最后一列
$(NF-n) : 取倒数第几列
$0 : 取所有列的信息
三剑客命令
老三: grep 过滤筛选信息
老二: sed 修改替换文件内容 擅长对文件中的行进行操作
老大: awk 擅长统计分析文件内容 擅长对文件中列进行操作