目录
grep命令
检索和过滤文件内容
命令的格式:grep [选项] 要查找的字符串 文件
在grep命令中,可以直接指定关键字串作为查找条件,也可以使用复杂的条件表达式。
例如:字符“^”表示行的开始;字符“$”表示行的结尾;如果查找的字符串中带有空格,可以用单引号或双引号括起来。又如:"^read"表示以read开始;"read$"表示以read结束;"^$"表示空行。
grep命令的选项
-i: ignorecase 查找时忽略大小写
-b: 将可执行文件(binary)当作文本文件(text)来搜索
-v: 反转,查找与给定条件不相符的内容
-c:仅显示找到的行数
-n:显示行号
注意事项:输出的结果是整行的内容。
[root@rhcsa link_test]# grep 2022 data2.txt
20220319
20220326
202203261448
202203261448
202203261448
202203261448
# 匹配空行
[root@rhcsa link_test]# grep "^$" data.txt# 匹配以3开始的行
[root@rhcsa link_test]# grep "^3" data.txt
3
33
# 匹配以0结尾的行
[root@rhcsa link_test]# grep "0$" data.txt
Z0Z0
Z0Z0
重定向
Linux重定向:主要是指我们的输入和输出的重定向。
重定向操作符本身不是一条命令,而是命令中附加的可改变命令的输入和输出对象的特殊符号
重定向操作符
>, >>: 输出重定向 有区别:echo "123" > file1.txt # >是将标准输出123,重定向输出在file1.txt当中
echo "456" > file1.txt # > 是将标准输出456,将其重定向并覆盖之前file1.txt当中的123的内容,当如果使用 >> 代表追加
<,<<: 输入重定向, < 指的是从文件读入, <<:指的是从命令行读入(键盘读入)
重定向的适用形式
适用形式 | 功能 |
命令 > 文件或者:命令1 > 文件 | 将命令执行后的输出信息不在默认的屏幕上显示,而是以覆盖的方式写入到指定文件中,若指定的文件不存在,则自动创建该文件 |
命令2 > 文件 | 将命令执行后所产生的错误信息不在默认的屏幕上显示,而是以覆盖的方式写入到指定文件中,若指定的文件不存在,则自动创建该文件 |
命令& > 文件 | 将命令执行后的输出信息和错误信息不在默认的屏幕上显示,而是以覆盖的方式写入到指定文件中,若指定的文件不存在,则自动创建该文件 |
命令2 > /dev/null | 将命令执行后所产生的错误信息不在默认的屏幕上显示,而是写入到空设备文件中,即将输出的错误信息丢弃掉 |
命令 >> 文件 | 将命令执行后的输出信息以追加的方式写入到指定的文件中 |
命令 < 文件 | 使命令从指定的文件中读取输入数据 |
命令 << 结束标识字符串 | 读取命令行输入,直到遇到输入行为指定的结束标识字符串 |
Linux系统中的默认标准输出:屏幕
Linux系统的标准输入:从键盘输入
Linux中还有一种输出:标准错误输出, 输出的也是屏幕,只是他是在错误的时候输出在屏幕上。
标准输入:stdin 文件描述符 0
标准输出:stdout 文件描述 1
标准错误输出:stderr 文件描述符 2
输出重定向
echo "456" > text.txt
# echo "456" => 输出在屏幕上 使用输出重定向 重定向到text.txt文件中
echo "456" 1> text.txt
# echo的输出:1:标准输出, 重定向到text.txt中[root@rhcsa link_test]# ls text2.txt
ls: cannot access 'text2.txt': No such file or directory
# 执行出错,将错误信息输出在屏幕上
ls text2.txt > text.txt[root@rhcsa link_test]# ls text2.txt > text.txt
ls: cannot access 'text2.txt': No such file or directory
[root@rhcsa link_test]# cat text.txt[root@rhcsa link_test]# test 123 2>1 error.txt
#erroe.txt 没有任何作用,不代表文件,只代表是echo的一个字符串
&符号:1&2
[root@rhcsa link_test]# ls www.txt &> redirect.txt
&的其他用法
[root@rhcsa link_test]# ls www.txt >& redirect.txt
[root@rhcsa link_test]# ls -l >& redirect.txt[root@rhcsa link_test]#cat data.txt www.txt > redirect.txt 2>&1
#data.txt是存在的文件,www.txt是不存在的文件,此命令的意思是,将标准输出data.txt重定向在redirect.txt当中,将标准错误输出www.txt以标准输出的形式重定向在redirect.txtx当中。
[root@rhcsa link_test]#cat data.txt www.txt 2> redirect.txt 1>&2
[root@rhcsa link_test]#cat test.txt 20210807redirect.txt 2>&1 new_error.txt
#cat test.txt => test.txt 是存在的,所以这个能正常执行
#cat 202110807redirect.txt => 文件是不存在的,执行的时候会报错
#cat: new_error.txt: No such file or directory
#2>&1 => 指的是我们把标准错误输出重定向到标准输出,所以这块儿是不需要文件名
/dev/null: 可以理解为一个垃圾站(windows的回收站不一样), 它不能回收。
输入重定向
<: 从文件读入
# 把原先的标注输入,重定向从文件输入
[root@rhcsa link_test]# cat < data.txt
[root@rhcsa link_test]# cat 0< data.txt
<<: 从命令行读入,输入指定的结束字符串后结束。
[root@rhcsa link_test]# cat <<EOF
> 123
> 123
> 456
> EOF
123
123
456
# cat <<EOF # 从命令行读入,输入EOF字符串结束
# 输入123,123,456
# 输入EOF结束
# cat命令输出输入的内容
命令搜索
whereis命令
查找二进制命令,源文件和帮助文档的命令。
搜索系统命令的命令,也就是说,whereis命令不能搜索普通文件,而只能搜索系统命令。
[root@localhost ~]# whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz
which命令
列出命令的所在路径。
which 也是搜索系统命令的命令。和 whereis 命令的区别在于:
1、whereis 命令可以在查找到二进制命令的同时,查找到帮助文档的位置。
2、而 which 命令在查找到二进制命令的同时,如果这个命令有别名, 则还可以找到别名命令。
[root@localhost ~]# which cp
alias cp='cp -i'
/usr/bin/cp
locate命令
按照文件名搜索文件。
优点: 按照数据库搜索,搜索速度快,消耗资源小。数据库位置/var/lib/mlocate/mlocate.db, 可以使用 updatedb 命令强制更新数据库。
缺点: 只能按照文件名来搜索文件, 而不能执行更复杂的搜索,比如按照权限、大小、修改 时间等搜索文件。
[root@kongd ~]# locate whereis
/usr/bin/whereis
/usr/share/bash-completion/completions/whereis
/usr/share/man/man1/whereis.1.gz
find命令
按照指定条件在路径中搜索,搜索完成之后可以执行某些操作。
命令格式:find [查找路径] 寻找条件 操作
find命令的参数
参数 | 作用 |
-name | 匹配名称 |
-perm | 匹配权限(mode为完全匹配,-mode为包含即可) |
-user | 匹配所有者 |
-group | 匹配所有组 |
-mtime -n +n | 匹配修改内容的时间(-n指n天以内,+n指n天以前) |
-atime -n +n | 匹配访问文件的时间(-n指n天以内,+n指n天以前) |
-ctime -n +n | 匹配修改文件权限的时间(-n指n天以内,+n指n天以前) |
-nouser | 匹配无所有者的文件 |
-nogroup | 匹配无所有组的文件 |
-newer f1 !f2 | 匹配比文件f1新但比f2旧的文件 |
--type b/d/c/p/l/f | 匹配文件类型(后面的字母参数依次表示块设备、目录、字符设备、管道、链接文件、文本文件) |
-size | 匹配文件的大小(+50KB为查找超过50KB的文件,而-50KB为查找小于50KB的文件) |
-prune | 忽略某个目录 |
-exec ...... {}\; | 后面可跟用于进一步处理搜索结果的命令 |
1、根据文件名称搜索
-name(精准匹配,除非加了通配符*)
[root@rhcsa link_test]# find . -name "data*" #.代表当前目录
[root@rhcsa link_test]# find . -iname "data*" # -iname 忽略大小写
[root@rhcsa link_test]# find . -inum 3325088 # -inum: 根据inode号来搜索./data.txt
2、根据文件大小搜索
-size [+|-]大小: 按照指定大小搜索文件
+|-, +代表大于,-代表小于
#-size的使用
`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)
[root@rhcsa link_test]# find . -size -10c
3、按照修改时间搜索
-atime [+|-]时间: 按照文件访问时间搜索
-mtime [+|-]时间: 按照文件数据修改时间搜索
-ctime [+|-]时间: 按照文件状态修改时间搜索
+|-: 以当前的时间为基准, 在多少天以内,以及在多少天以前
4、时间查找参数
-atime n :将n24小时内存取过的的文件列出来
-ctime n :将n24小时内改变、新增的文件或者目录列出来
-mtime n :将n*24小时内修改过的文件或者目录列出来
-newer file :把比file还要新的文件列出来
-mtime:-mtime n : n表示代表n*24h
-mtime +1: >1天的,最少是两天以前修改的
-mtime -1:在1*24小时之内修改的
-mtime 1: 1*24h小时之内修改, 4: 代表的是4-5天之内
find . -mtime -1.
./link_file
./hard_link
./symb_link
./data2.txt
./test_quit.txt
./tee_test.txt
./test_test.txt
./pipename
./p
./data.txt
./ml.txt
./text.txt
./redirect.txt
./link_symb
./finddir
./2
[root@rhcsa link_test]# ls -l text.txt
-rw-r--r--. 1 root root 57 Mar 26 00:00 text.txt
[root@rhcsa link_test]# find . -mtime 1
./text.txt
[root@rhcsa link_test]# touch -d 20220319 link_file
[root@rhcsa link_test]# ls -l link_file
-rw-r--r--. 3 root root 0 Mar 19 00:00 link_file
[root@rhcsa link_test]# find . -mtime +1
./link_file
./hard_link
./symb_link
-newer file : 比file文件新的文件
[root@rhcsa link_test]# find . -newer 2
.
./newer
5、按照权限搜索
-perm 权限模式: 查找文件权限刚好等于“权限模式”的文件
-perm -权限模式: 查找文件权限全部包含“权限模式”的文件
# - 代表的是包含
-perm /权限模式: 查找文件权限包含“权限模式”的任意一个权限的文件
# / 代表 <=
6、按照所有者和所属组搜索
-uid 用户 ID: 按照用户 ID 查找所有者是指定 ID 的文件
-gid 组 ID: 按照用户组 ID 查找所属组是指定 ID 的文件
-user 用户名: 按照用户名查找所有者是指定用户的文件
-group 组名: 按照组名查找所属组是指定用户组的文件
-nouser: 查找没有所有者的文件
7、按照文件类型搜索
命令格式:find . -type
f: 普通文件
d:目录文件
b: 块设备文件
c: 字符设备文件
l: 链接文件
p: 管道文件
s: 套接字文件
8、逻辑运算符
-a: and 逻辑与
-o: or 逻辑或
-not: not 逻辑非
9、其他选项
-exec参数:execute: 执行的意思: 操作
在查找到信息之后,去执行某些操作。(会在shell脚本中经常出现)。
这个参数用于把find命令搜索到的结果交由紧随其后的命令作进一步处理,它十分类似于管道符技术,并且由于find命令对参数的特殊要求,因此虽然exec是长格式形式,但依然只需要一个减号(-)
Linux系统中的配置文件会保存到/etc目录中。如果要想获取到该目录中所有以host开头的文件列表,可以执行如下命令:
#-print:每行打印一条
[root@localhost ~]# find /etc -name "host*" -print
/etc/host.conf
/etc/hosts
/etc/hostname
/etc/avahi/hosts
/etc/nvme/hostnqn
/etc/nvme/hostid#-print0:Linux中的空字符"\0"分隔每一个内容
[root@localhost ~]# find /etc -name "host*" -print0
/etc/host.conf/etc/hosts/etc/hostname/etc/avahi/hosts/etc/nvme/hostnqn/etc/nvme/hostid[root@localhost ~]#
“-exec {} \;”参数
其中的{}表示find命令搜索出的每一个文件,并且命令的结尾必须是“\;”
-exec
1.参数是一个一个传递的,传递一个参数执行一次rm
2.文件名有空格等特殊字符也能处理
[root@rhcsa link_test]# find . -name "ml*"
./ml.txt
./ml2.txt
./ml3.txt# 找到之后,删除这三个文件
rm -f ml.txt
rm -f ml2.tx
rm -f ml3.txt
[root@rhcsa link_test]# find . -name "ml*" -exec rm -f {} \;
#按上面操作:rm 执行了几次 -- 执行了3次
rm -f ml.txt ml2.txt ml3.txt
rm -f ml.txt
rm -f ml2.txt
rm -f ml3.txt
-xargs
xargs擅长将标准输入数据转换成命令行参数。xargs能处理stdin并将其转换为特定命令的命令行参数。
1.一次将参数传给命令,可以使用-n控制参数个数
2.处理特殊文件名需要采用如下方式:
find . -name "*.txt" print0 |xargs -0 rm {}
上面exec可以使用xargs来替代,那么他们有什么区别呢?
find . -name ".txt" -exec rm {} \;
find . -name ".txt" | xargs rm {}
xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理。通常情况下,xargs从管道或者stdin中读取数据,但是它也能够从文件的输出中读取数据。xargs的默认命令是echo,这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代。
xargs常用场景:
1、假如你有一个文件包含了很多你希望下载的URL, 你能够使用xargs 下载所有链接
# cat list.txt | xargs wget –c
2、查找所有的jpg文件并压缩
# find / -name *.jpg -type f -print | xargs tar -cvzf images.tar.gz
3、一个文件夹下文件太多,使用rm删除就会出现/bin/rm: Argument list too long错误,当然使用别的命令也是一样的错误,像ls,chmod等。
解决方法:
方法1:
ls | xargs -n 10 rm -fr
方法2:
find . -maxdepth 1 -name "*.sh" -type f -exec rm -f {} \;
文本排序统计
cut命令
按列提取文本内容。如果按列提取,有一个关键问题,怎么来分割列。
命令格式: cut [选项] 文件
cut命令的选项
-d: 指定分隔符, 按列提取的时候,就根据分隔符来进行列切割。
-f:多列,你想取哪一列就取哪一列,取多列
root@rhcsa link_test]# cut -d":" -f7 /etc/passwd | head -2
/bin/bash
/sbin/nologin
[root@rhcsa link_test]# cut -d":" -f5,7 /etc/passwd | head -2 # 取不连续的列
root:/bin/bash
bin:/sbin/nologin
[root@rhcsa link_test]# cut -d":" -f5-7 /etc/passwd | head -2 # 取连续列
root:/root:/bin/bash
bin:/bin:/sbin/nologin
uniq命令
用于去除文本中连续的重复行
命令格式:uniq [选项] 文件名
[root@rhcsa link_test]# cut -d":" -f7 /etc/passwd | uniq
/bin/bash
/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
/sbin/nologin
/bin/bash
# 上面并完全去重,因为行不连续
[root@rhcsa link_test]# cat uniq.txt
Hello
Hello
Hello
World
World
Hello
World[root@rhcsa link_test]# uniq uniq.txt
Hello
World
Hello
World
[root@rhcsa link_test]# cat uniq.txt
Hello
Hello
Hello
World
World
World
World[root@rhcsa link_test]# uniq uniq.txt
Hello
World
sort命令
用于对文本内容进行再排序
命令格式: sort [选项] 文件名
sort命令中的参数
参数 | 作用 |
-f | 忽略大小写 |
-b | 忽略缩进与空格 |
-n | 以数值型排序 |
-r | 反向排序 |
-u | 去除重复行 |
-t | 指定间隔符 |
-k | 设置字段范围 |
-u:进行去重排序
[root@rhcsa link_test]# cat uniq.txt
Hello
Hello
Hello
World
World
Hello
World[root@rhcsa link_test]# uniq uniq.txt
Hello
World
Hello
World
[root@rhcsa link_test]# sort uniq.txt | uniq
Hello
World
[root@rhcsa link_test]# sort -u uniq.txt
Hello
World
-n: 按数字进行排序
1111, 123如果是按照字符串排序:1111,123,如果按数字排序的话:123,1111
[root@rhcsa link_test]# sort num.txt
111
1111
123
221
222
333
444
456
678
[root@rhcsa link_test]# sort -n num.txt
111
123
221
222
333
444
456
678
1111
-t和-k: -t: 指定分隔符, -k:分割的字段
[root@rhcsa link_test]# cat student.txt
1:Haier:f:18
4:ang:m:20
3:Li:m:22
[root@rhcsa link_test]# sort -t":" -k1 student.txt
1:Haier:f:18
3:Li:m:22
4:ang:m:20
[root@rhcsa link_test]# sort -t":" -k2 student.txt
4:ang:m:20
1:Haier:f:18
3:Li:m:22
[root@rhcsa link_test]# sort -t":" -k4 student.txt
1:Haier:f:18
4:ang:m:20
3:Li:m:22
tr命令
用于转换或删除文件中的字符。
命令格式:tr [选项] SET1 [SET2]
替换功能:就是将SET1和SET2对应起来进行替换,SET1和SET2是两个集合。
SET1=SET2 =》 SET1可以和SET2一一对应上
SET1<SET2 =》 SET1中元素少,SET2元素多
SET1>SET2 => SET1中元素多,SET2的元素少
用SET2中的字符去替换SET1中字符,一一对应去替换
tr命令的参数
-c, --complement:反选设定字符。也就是符合 SET1 的部份不做处理,不符合的剩余部份才进行
转换
-d, --delete:删除指令字符
-s, --squeeze-repeats:缩减连续重复的字符成指定的单个字符
-t, --truncate-set1:削减 SET1 指定范围,使之与 SET2 设定长度相等
[root@rhcsa link_test]# cat tr_data
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz# 需要一个替换的功能:tr SET1 SET2
[root@rhcsa link_test]# cat tr_data | tr 'A-Z' 'a-z'
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz# SET1和SET2可以一一对应的情况
# SET1如果小于SET2的情况
# 所以只替换SET1指定的字符,其他字符不动
[root@rhcsa link_test]# cat tr_data | tr 'A-L' 'a-z'
abcdefghijklMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
#SET1如果大于SET2的情况
#先按照SET2中字符去一一替换,然后剩余字符使用set2的最后一个字符来代替
[root@rhcsa link_test]# cat tr_data | tr 'A-Z' 'a-l'
abcdefghijklllllllllllllll
abcdefghijklmnopqrstuvwxyz
wc命令
用于统计指定文本文件的行数、字数或字节数。
语法格式为:“wc [参数] 文件名称”
wc命令中的参数
参数 | 作用 |
-l | 只显示行数 |
-w | 只显示单词数 |
-c | 只显示字节数 |
压缩和解压缩
zip命令和unzip命令
使用zip的方式压缩和解压缩文件。
命令格式:zip [选项] 压缩名 原文件
注意事项:压缩有两种方式
1、压缩之后保留原文件。
2、压缩之后去除原文件。
zip压缩之后原文件存在。
实例1: 使用zip压缩文件test1.txt
[root@localhost test]# zip test1.zip test1.txt
adding: test1.txt (stored 0%)
[root@localhost test]# ls test1*
test1.txt test1.zip
压缩率为最高压缩test2.txt
[root@localhost test]# zip -9 test2.zip test2.txt
adding: test2.txt (stored 0%)
[root@localhost test]# ls test2*
test2.txt test2.zip
实例2: 将当前目录dir1连同目录下文件一起压缩
[root@localhost test]# zip -r dir1.zip dir1/
adding: dir1/ (stored 0%)
adding: dir1/fstab (deflated 44%)
[root@localhost test]# ls dir1*
dir1.zip
dir1:
fstab
实例3: 向压缩文件中test1.zip中添加test2. txt文件
[root@localhost test]# zip -m test1.zip test2.txt
adding: test2.txt (stored 0%)
实例4: 删除压缩文件中的文件
[root@localhost test]# zip -d test1.zip test2.txt
实例5: 压缩文件时排除某个文件
[root@localhost test]# zip test.zip *.txt -x test1.txt
adding: test3.txt (stored 0%)
adding: test4.txt (stored 0%)
adding: test5.txt (stored 0%)
实例6: 解压文件test2.zip
[root@localhost test]# unzip test2.zip
Archive: test2.zip
extracting: test2.txt
实例7:将压缩文件text.zip在指定目录dir1下解压缩
[root@localhost test]# unzip test.zip -d dir1
Archive: test.zip
extracting: dir1/test3.txt
extracting: dir1/test4.txt
extracting: dir1/test5.txt
实例8:查看压缩文件目录,但不解压
[root@localhost test]#unzip -v test.zip
Archive:test.zip
Length Method Size Cmpr Date Time CRC-32 Name
-------- ------ ------- ---- ---------- ----- -------- ----
6 Stored 6 0% 06-17-2017 17:53 4e6f5599 test3.txt
6 Stored 6 0% 06-17-2017 17:53 012ec35e test4.txt
6 Stored 6 0% 06-17-2017 17:53 1835f21f test5.txt
-------- ------- --- -------
18 18 0% 3 files
gzip和gunzip命令
gzip压缩之后原文件不存在。
实例1: 使用gzip压缩文件
[root@localhost test]# gzip test1.txt
[root@localhost test]# ls test1*
test1.txt.gz test1.zip
实例2: 使用gzip压缩目录下文件
[root@localhost test]# gzip -r dir1/
[root@localhost test]# ls dir1
fstab.gz test3.txt.gz test4.txt.gz test5.txt.gz#注意: 以上压缩之后原始文件就没有了
实例3: 压缩但保留原始文件
[root@localhost test]# gzip -c test2.txt > test2.txt.gz
[root@localhost test]# ls test2*
test2.txt test2.txt.gz test2.zip
bzip2和bunzip2命令
bzip2、bunzip2是更新的Linux压缩工具,比gzip有着更高的压缩率。
1.bzip2命令
2.bunzip2命令
bzip2、bunzip2示例如下:
# bzip2 -z man.config //将man.config以bzip2压缩,此时man.config变man.config.bz2
# bzip2 -9 -c man.config > man.config.bz2 //将man.config.用最佳的压缩比压缩,保留原本的档案
# bzip2 -d man.config.bz2 //将man.config.bz2解压缩,可用bunzip2取代bzip2-d
# bunzip2 man.config.bz2 //将man.config.bz2解压缩
xz和unxz命令
实例1:压缩文件
[root@localhost test]# xz test1.txt
[root@localhost test]# ls test1.txt.xz
test1.txt.xz
实例2:压缩dir1目录下文件
[root@localhost test]# xz dir1/*
[root@localhost test]# ls dir1
fstab.xz test3.txt.xz test4.txt.xz test5.txt.xz
实例3:查看压缩文件内容
[root@localhost test]# xzcat test1.txt.xz
test1
实例4:解压缩
[root@localhost test]# unxz test1.txt.xz
实例5:解压缩目录dir1下文件
[root@localhost test]# xz -d dir1/*
[root@localhost test]# ls dir1
fstab test3.txt test4.txt test5.txt#注意:xz -d等价于unxz
显示压缩文件的内容:zcat、zless、bzcat、bzless
不解压,显示压缩文件的内容:zcat、zless、bzcat、bzless。
1.zcat、zless**
[root@localhost test]# zcat test2.txt.gz
test2
2.bzcat、bzless**
例如:
# bzcat man.config.bz2 //在屏幕上显示man.config.bz2解压缩之后的内容