三剑客命令

罗小黑
2021-04-13 / 0 评论 / 320 阅读 / 正在检测是否收录...
广告
温馨提示:
本文最后更新于2021年04月19日,已超过1270天没有更新,若内容或图片失效,请留言反馈。

find 命令语法

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

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...]

--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$" 文件
找出全部内容显示,不显示空行
grep -v "^$" 文件

系统的正则符号

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

grep ".*" 123.txt
grep "^m.*n$" 123.txt

贪婪匹配

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

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

grep "te[as]t" test.txt #找出teat和test

5)括号和尖号[^]

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、指定信息进行整体匹配

grep -E "wqe(as)d" test.txt

sed

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

sed [option]... 'script' inputfile

选项
-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行的信息

sed -n '/test/' test.txt

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

sed -e '/test/i123 -e /test/456' /test.txt

3、sed删除命令

sed '3d' test.txt #删除前三行
sed '2,6d' test.txt #删除多行
sed '/test/d' test.txt #删除test行
sed '3d;6d' test.txt #删除3行和6行

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

sed -n '/^$/!p' test.txt
sed -n '/./p' test.txt
sed '/^$/d' test.txt

5、修改内容

sed 's#原有的内容#修改的内容#g' 文件

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

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

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

awk命令

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

查询信息

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 #同上

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

grep -E "^#|^$" 文件
sed -n '/^#|^$/!p' 文件
awk '$0~/^#|^$/' 文件
awk '$0!~/^#|^$' 文件

总结:awk命令中$符号
$1,$2,$3 :取第几列信息
$NF :取最后一列
$(NF-n) :取倒数第n列
$0 :取所有列的信息,只显示一行

正则表达式与操作符

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

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

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

[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模块类似的结尾标识信息。

[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 文件的#号开头的行

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

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

普通:awk '$NF~/bash/ {i=i++}END{print i}' /etc/passwd
虚拟:awk '$NF!~/bash/ {i=i++}END{print i}' /etc/passwd

求和计算

sum =sum+$n

seq 10|awk '{sum=sum+$1;print sum}'
[root@creditease awk]# seq 100|awk '{i=i+$0}END{print i}'
5050
0

打赏


评论 (0)

取消