三剑客命令

2022-12-28 20:14:17 浏览数 (3)

find 命令语法

find 查找的目录 -type 类型信息 -name "文件名"

代码语言:javascript复制
find   /etc     -type f -name "hosts"
find  /etc -type f -name "*eth0"  #模糊查找,文件名记不清
find  /etc -type f -i -name "if*" #忽略大小写

根据数据大小查找
find /etc -type f -size  100   #找出大于100k文件
find /etc -type f -size -100   #找出小于100k文件
find /etc -type f -size  1M    #找出大于1m文件

根据目录指定层级查找
find /etc -maxdepth 1 -type f -name "123.txt"

如何把一个目录中所有“*.txt”文件进行压缩
find /home -type f -name "*.txt"|xargs tar -zcvf /home/home.tar.gz

如何找出/home目录中".txt"文件进行删除
1、find /home -type f -name "*.txt" -delete
2、find /home -type f -name "*.txt" -exec rm-f {} ;
3、find /home -type f -name "*.txt"|xargs rm -f
4、rm -rf $(find /home -type f -name "*.txt")

如何找出/home目录中".txt"文件进行文件复制/移动
find /home -type f -name "*.txt" -exec cp {} /tmp ;
find /home -type f -name "*.txt" |xargs cp -t /tmp 
find /home -type f -name "*.txt" -exec mv {} /tmp ;

元字符

功能

意思

^

匹配行首

表示以某个字符开头

$

匹配行尾

表示以某个字符结尾

^$

空行的意思

表示空行的意思

.

匹配任意单个字符

表示任意一个字符

*

字符* 匹配0或多个此字符

表示重复的任意多个字符

屏蔽一个元字符的特殊含义

表示去掉有意义的元字符的含义

[]

匹配中括号内的字符

表示过滤括号内的字符

.*

代表任意多个字符

就是代表任意多个字符

lele{n}

用来匹配前面lele出现次数。n为次数

就是统计前面lele出现的次数

lele{n,}

含义同上,但次数最少为n

从功能就可以看出

lele{n,m}

义同上,但lele出现次数在n与m之间

从功能就可以看出

lele{n,m}

义同上,但lele出现次数在n与m之间

从功能也可以看出

三剑客的功能非常强大,但我们只需要掌握他们分别擅长的领域即可:grep擅长查找功能,sed擅长取行和替换。awk擅长取列。

grep命令

文本过滤(模式:pattern)工具,grep, egrep

grep [OPTIONS] PATTERN [FILE...]

代码语言:javascript复制
--color=auto 对匹配到的文本着色显示
-v 显示不被pattern匹配到的行
-i 忽略字符大小写
-n 显示匹配的行号
-c 统计匹配的行数
-o 仅显示匹配到的字符串
-q 静默模式,不输出任何信息
-A # after, 后#行
-B # before, 前#行
-C # context, 前后各#行
-e 实现多个选项间的逻辑or关系
grep –e ‘cat ’ -e ‘dog’ file
-w 匹配整个单词
-E 使用ERE,相当于egrep
-F 相当于fgrep,不支持正则表达式

找出123开头的行grep "^123" 文件找出456结尾的行grep "456

系统的正则符号

基础正则符号: 1)点符号:. 匹配一个字符且只有一个字符 grep "." ~/test.txt grep "." ~/test.txt -o #-o 显示匹配过程 2)星号:* 匹配一个字符连续出现30次或者多次 grep "0*" test.txt 3)点星组合

代码语言:javascript复制
grep ".*" 123.txt
grep "^m.*n$" 123.txt

贪婪匹配

代码语言:javascript复制
grep "^r.*x$" 123.txt #这种情况会把文件中从第一个r开头一直x结尾的匹配出来,中间如果有两三个x,也会被匹配出来
指定具体信息阻止贪婪匹配
grep "^r.*wex" 123.txt

4)括号符号[] 匹配多个信息

代码语言:javascript复制
grep "te[as]t" test.txt #找出teat和test

5)括号和尖号[^]

代码语言:javascript复制
grep "[abc]" /test.txt #找出abc的行
grep "[^abc]" /test.txt #找出abc以外的行
grep "^[^abc]" /test.txt #排出abc以外的行

扩展正则符号

默认grep、sed不能直接识别 grep ——> egrep /grep -E sed ——> sed -r

号符号

匹配前一个字符连接出现1次或者多此 egrep "0 " test.txt

|匹配多个信息

grep -E "123|456" test.txt grep -E "te[as]t" test.txt

符号括号:()

作用: 1、指定信息进行整体匹配

代码语言:javascript复制
grep -E "wqe(as)d" test.txt

sed

sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’ 的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

sed [option]... 'script' inputfile

代码语言:javascript复制
选项
-n 不输出模式空间内容到屏幕,即不自动打印
-e 多点编辑
-f /PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本
-r 支持使用扩展正则表达式
-i 直接编辑文件
-i.bak 备份文件并原处编辑
script 地址定界
不给地址:对全文进行处理
单地址:
#: 指定的行,$:最后一行
/pattern/:被此处模式所能够匹配到的每一行
地址范围:
#,#
#, #
/pat1/,/pat2/
`#,/pat1/
~:步进
1~2 奇数行
2~2 偶数行
编辑命令:
d 删除模式空间匹配的行,并立即启用下一轮循环
p 打印当前模式空间内容,追加到默认输出之后
a []text1 在指定行后面追加文本,支持使用n实现多行追加
i []text 在行前面插入文本
c []text 替换行为单行或多行文本
w /path/somefile 保存模式匹配的行至指定文件
r /path/somefile 读取指定文件的文本至模式空间中匹配到的行后
= 为模式空间中的行打印行号
! 模式空间中匹配行取反处理
s///:查找替换,支持使用其它分隔符,s@@@,s###
替换标记:
g 行内全局替换
p 显示替换成功的行
w /PATH/TO/SOMEFILE 将替换成功的行保存至文件中


直接修改读取的文件内容,而不是输出到终端。
s :取代,可以直接进行取代的工作。

g: 是全局的意思。其中#是格式符,他也可以是@或者别的/。

Sed替换格式是:sed -i 's/要替换的内容/替换成的内容/g' 文件名。

1、找出文件中有test行的信息

代码语言:javascript复制
sed -n '/test/' test.txt

2、在test前面添加123,在test后面添加456信息

代码语言:javascript复制
sed -e '/test/i123 -e /test/456' /test.txt

3、sed删除命令

代码语言:javascript复制
sed '3d' test.txt #删除前三行
sed '2,6d' test.txt #删除多行
sed '/test/d' test.txt #删除test行
sed '3d;6d' test.txt #删除3行和6行

4、利用sed命令取消空行显示

代码语言:javascript复制
sed -n '/^$/!p' test.txt
sed -n '/./p' test.txt
sed '/^$/d' test.txt

5、修改内容

代码语言:javascript复制
sed 's#原有的内容#修改的内容#g' 文件

PS:修改文件内容直接备份 sed -i .bak 's#xxx#yyy#g' test.txt

n和i参数同时使用会将文件内容清空 6、批量修改文件扩展名:将test.txt扩展名修改为.png

代码语言:javascript复制
ls test*.txt|sed -r 's#(.*)txt#mv&|png#g' |bash
专业命令
rename 'txt                       .png        text.txt
命令    文件名称需要修改的部分信息  修改的信息   文件

awk命令

作用: (1) 排除信息 (2) 查询信息 (3) 统计信息 (4) 替换信息 语法格式 awk [参数] '模式-动作' 文件

查询信息

代码语言:javascript复制
awk 'NR==2' test.txt   #显示第二行
awk 'NR==2, NR==4' test.txt #显示二到四行
awk 'NR==2; NR==4' test.txt #显示二和四行
awk '/wang/' test.txt  #显示wang行
awk '/wang/,/666/' test.txt #显示有wang的行到有666行
awk '/wang/;/666/' test.txt #显示wang行和666行
awk '/wang/ {print $1 $3}' test.txt #显示有wang行的第一列和第三列内容
awk '/wang/ {print $1 "," $3}'  test.txt #同上

文件空行进行排除/注释排除

代码语言:javascript复制
grep -E "^#|^$" 文件
sed -n '/^#|^$/!p' 文件
awk '$0~/^#|^$/' 文件
awk '$0!~/^#|^$' 文件

总结:awk命令中符号1,2,3 :取第几列信息NF :取最后一列(NF-n) :取倒数第n列

正则表达式与操作符

awk同sed一样也可以通过模式匹配来对输入的文本进行匹配处理。 awk也支持大量的正则表达式模式,大部分与sed支持的元字符类似,而且正则表达式是玩转三剑客的必备工具。

awk支持的正则表达式元字符

BEGIN {} 在awk执行命令前做什么事情 BEGIN模块在awk读取文件之前就执行,BEGIN模式常常被用来修改内置变量ORS,RS,FS,OFS等的值。可以不接任何输入文件

代码语言:javascript复制
[root@creditease awk]# awk 'BEGIN{print "=======start======"}{print $0}' awk.txt 
=======start======
ABC#DEF#GHI#GKL$123
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321

END {} 在awk执行命令结束后做什么事情 END在awk读取完所有的文件的时候,再执行END模块,一般用来输出一个结果(累加,数组结果)。也可以是和BEGIN模块类似的结尾标识信息。

代码语言:javascript复制
[root@creditease awk]# awk 'BEGIN{print "=======start======"}{print $0}END{print "=======end======"}' awk.txt
=======start======
ABC#DEF#GHI#GKL$123
BAC#DEF#GHI#GKL$213
CBA#DEF#GHI#GKL$321
=======end======

统计/etc/services 文件的#号开头的行

代码语言:javascript复制
awk '/^#/ {i=i  ;print i}' /etc/services
或者
[root@creditease awk]# grep "^$" /etc/services  |wc -l
17
[root@creditease awk]# sed -n '/^$/p' /etc/services |wc -l
17
[root@creditease awk]# awk '/^$/' /etc/services |wc -l
17
[root@creditease awk]# awk '/^$/{i=i 1}END{print i}' /etc/services
17

统计有多少个虚拟用户和普通用户

代码语言:javascript复制
普通:awk '$NF~/bash/ {i=i  }END{print i}' /etc/passwd
虚拟:awk '$NF!~/bash/ {i=i  }END{print i}' /etc/passwd

求和计算

sum =sum $n

代码语言:javascript复制
seq 10|awk '{sum=sum $1;print sum}'
[root@creditease awk]# seq 100|awk '{i=i $0}END{print i}'
5050

1 人点赞