1、文本处理工具【grep】
- 【grep】 是一个文本搜索工具,它可以根据用户指定的模式在文件中进行搜索,并打印出包含匹配模式的行。"Global Regular Expression Print" “全局正则表达式打印”。
- grep 命令的三个常用变体
-
- 【grep】——支持基本的正则表达式
- 【egrep】——支持扩展的正则表达式(相当于使用了 -E 选项)
- 【fgrep】——不支持正则表达式,而是进行固定字符串的匹配
- 格式:
-
- grep [选项] 模式 文件
- 选项
-
- 【--color】在匹配到的文本上指定颜色(仅在某些系统上支持,例如 CentOS 6)。
- 【-v】反向匹配,显示不能被模式匹配到的行。
- 【-o】仅匹配被模式匹配到的字符串,而非整行。
- 【-q】静默模式,不输出任何结果,仅用于检查模式是否存在。
- 【-i】不区分大小写,即忽略大小写进行匹配。
- 【-n】过滤时加上在文本中对应的行号。
- 【-f】从指定的文件中读取模式,用于在多个文件中搜索相同的模式。
- 【-r/-R】递归搜索目录下的文件,但不处理软链接。
- 【-E】支持扩展正则表达式(相当于使用了 egrep)。
- 示例
#1、在文件 example.txt 中搜索包含单词 "apple" 的所有行,并显示行号:
grep -n "apple" example.txt
#2、在多个文件中搜索字符串 "error",忽略大小写,并显示匹配的行:
grep -i "error" file1.txt file2.txt
#3、在当前目录及其子目录中递归搜索文件,并输出匹配模式的行:
grep -r "pattern" .
#4、从文件 patterns.txt 中读取多个模式,并在文件 data.txt 中搜索这些模式:
grep -f patterns.txt data.txt
#5、搜索包含字母 "a" 但不包含 "b" 的行:
grep "a" file.txt | grep -v "b"
#6、静默模式示例,检查是否存在某个模式:
grep -q "pattern" file.txt && echo "Pattern found" || echo "Pattern not found"
2、正则表达式
- 正则表达式(Regular Expression)是一种用于描述字符串模式的工具,常用于搜索、替换和匹配文本。
-
- 分为基本正则表达式(BRE)和扩展正则表达式(ERE)两种形式
- PCRE(Perl Compatible Regular Expression)也是一种广泛使用的正则表达式标准。
- 基本正则表达式(BRE)
-
- 元字符是正则表达式中具有特殊含义的字符,它们不表示字符本身的意义,而是用于描述文本模式的特殊功能性(出现需要用引号引起来,单引号也可以解释元字符,但不可变量替换)
- BRE是一种较早期的正则表达式语法,主要用于传统的Unix工具(如grep、sed、awk等)。BRE中的元字符和语法较为简单,包括以下一些基本元字符:
-
-
- 【.】匹配任意单个字符,除了换行符 \n 之外的任何字符。
- 【[]】(字符集)匹配字符集中的任意一个字符。
-
-
-
-
- [0-9],[[:digit:]]
- [a-z],[[:lower:]] 匹配任意单个小写字母(注意:区分大小写)
- [A-Z],[[:upper:]] 匹配任意单个大写字母(注意:区分大小写)
- 所有的字母:[[:alpha:]] [a-Z]
- 字母+数字:[[:alnum:]] [0-Z]
- 空格:[[:space:]] 简化写法[ ]
- 标点符号:[[:punct:]]
- [^]: 指定范围外的任意单个字符
-
-
-
-
- 【*】匹配前一个字符的零次或多次。
-
-
-
- 【^】锚定行首,用于匹配行首的文本。
- 【$】锚定行尾,用于匹配行尾的文本。
- 【\】(反斜杠)转义字符,用于取消元字符的特殊含义,或表示特殊字符。
-
-
- 示例
grep '^a' file.txt #匹配以字母 a 开头的单词
grep '[0-9]$' file.txt #匹配以数字结尾的行
grep '[a-z]' file.txt #匹配包含至少一个小写字母的行
grep '^[A-Z]' file.txt #匹配以大写字母开头的单词
grep '.' file.txt #匹配包含任意字符 . 的行
grep 't$' file.txt #匹配以 t 结尾的单词
grep 'abc\|def' file.txt #匹配包含 abc 或 def 的行
grep '^abc.*def$' file.txt #匹配以 abc 开头,以 def 结尾的行
- 扩展正则表达式(ERE)
-
- (ERE)是一种在文本搜索和处理中常用的强大工具,它提供了比基本正则表达式更丰富和更灵活的功能
- 基本元字符
-
-
- 【+】匹配前一个字符的一次或多次。
- 【?】匹配前一个字符的零次或一次。
- 【{m,n}】匹配前一个字符的至少m次,至多n次。
- 【|】 逻辑或。
- 【()】分组。
-
-
- 特性
-
-
- 支持重复次数缩写: 使用 【+】表示一个或多个重复,【?】 表示零个或一个重复,【{m,n} 】表示至少 m 次、至多 n 次的重复
- 支持分组和反向引用: 使用圆括号 【( )】 将字符分组,并使用 \1, \2 等来引用分组匹配到的内容。
- 支持更多的元字符: 如 【\b】 表示单词边界,【\w】 表示字母数字字符等
- 支持更多的特殊字符:如 【|】 表示逻辑或,【()】 表示优先级等
- 支持更多的定位符: 如 【\b】 表示单词边界,【^】 表示行首,【$】 表示行尾
-
-
- 示例
grep 'ba+na' file.txt # 匹配 "bana", "baana", "baaana", 等等
grep 'go?gle' file.txt # 匹配 "gogle", "google"
grep 'go{2,4}gle' file.txt # 匹配 "google", "gooogle", "goooogle"
grep '\(ba\)\{2\}' file.txt # 查找其中连续出现两次的字符串 ba
grep '\(ba\)\(na\)\1\2' file.txt # 匹配 "banana",不匹配 "bana", "bananana"等
grep '\bword\b' file.txt # 匹配 "word",不匹配 "words", "sword"等
grep '\b\w+\b' file.txt # 匹配任意单词
grep 'apple|banana' file.txt # 匹配包含 "apple" 或 "banana" 的行
grep 'a(b|c)d' file.txt # 匹配 "abd" 或 "acd"
grep '^start' file.txt # 匹配以 "start" 开头的行
grep 'end$' file.txt # 匹配以 "end" 结尾的行
- 次数匹配
-
- 用来指定匹配其前面的字符的次数
-
-
- 【*】零次或多次。【.】任意单个字符。【\?】零次或一次。【+】至少出现一次。
- 【\{m\}】出现 m 次。【\{m,n\}】至少出现 m 次,至多出现 n 次。
- 【\{m,\}】至少出现 m 次。【\{,n\}】至多出现 n 次
-
-
- 做变量换算需要使用“”
-
-
- 要使用变量进行匹配次数的灵活控制,通常需要使用双引号 " " 或单引号 ' ' 将正则表达式包裹起来,以确保变量能够正确地被解释和替换。
- 这样做可以避免因为特殊字符或空格而导致的解析错误。
- 例如,在 Bash 脚本中,如果想要使用一个变量来表示匹配次数,可以这样写:
-
-
-
-
- 双引号 【" "】 可以确保 【$m】 被正确地替换为其值,从而形成最终的正则表达式 【"ba{2}na"】
- 如果使用单引号 【' '】,则变量【$m】将会被原样输出,而不会被替换为值。
-
-
-
- 脚本练习题:要求:从etc目录下随机找到两个文本文件,筛选出包含字母和数字的文件
#!/bin/bash
# 1. 获取 /etc 目录下所有文件列表
file_list=$(ls /etc)
# 2. 从文件列表中随机选择两个文件
random_files=($(shuf -n 2 -e $file_list))
# 3. 对每个选定的文件,检查其内容是否包含字母和数字
for file in "${random_files[@]}"; do
# 检查文件是否存在并且是普通文件
if [[ -f "/etc/$file" ]]; then
# 使用 grep 命令查找文件内容是否包含字母和数字
if grep -q '[a-zA-Z0-9]' "/etc/$file"; then
# 4. 如果包含字母和数字,则将其打印出来
echo "文件 /etc/$file 包含字母和数字。"
else
echo "文件 /etc/$file 不包含字母和数字。"
fi
else
echo "文件 /etc/$file 不存在或不是普通文件。"
fi
done
- 位置锚定:指定字符或模式在文本中的特定位置出现
-
- 【^】行首。【$】行尾。【^$】空白行
- 注意:正则表达式中的【|】代表逻辑运算
- 单词锚定 :用于匹配整个单词,而不是单词的一部分。需要精确匹配单词时
-
- 词首锚定
-
-
- 用法:【\<】 或 【\b】 用于指定单词的起始位置。
-
-
- 词尾锚定
-
-
- 用法:【\>】 或 【\b】 用于指定单词的结束位置。
-
-
- 精确匹配单词
-
-
- 用法:【\<单词\>】 用于匹配整个单词。
-
-
- 分组:
-
-
- 用法:【\(字符\)】将一个或多个字符捆绑在一起,作为一个整体处理。
- 示例:\(sb\)\+.* 匹配至少一个或多个连续出现的 "sb",并且后面跟着任意字符。
-
-
- 后向引用:
-
-
- 用法:用于在正则表达式中引用捕获组中匹配的内容。
- 示例:\1 表示对第一个捕获组的后向引用,\2 表示对第二个捕获组的后向引用,以此类推。
- 示例:\(baby\).*\1 匹配以 "baby" 开头的字符串,并且后面再次出现相同的字符串。
-
-
- 注意:Linux所有连续字母,没有用符号分割的,可以理解为单词
3、文本处理类的命令
1. 【wc】统计文件中的信息
-
- 用于统计文件中的字节数、字数、行数等信息。其名称来源于 "word count",最初用于计算文本文件中的单词数。
-
-
- 可以方便地获取文件的各种统计信息,对于文本文件的处理和分析非常有用。
-
-
- 基本语法
-
-
- wc [选项] [文件名]
-
-
- 常用选项
-
-
- 【-c, --bytes】显示文件的字节数。
- 【-m, --chars】显示文件的字符数。
- 【-l, --lines】显示文件的行数。
- 【-w, --words】显示文件的词数。
- 【-L, --max-line-length】显示文件中最长行的长度。
-
-
- 示例
#1、统计文件的行数、词数和字节数:
wc file.txt
#2、只统计文件的行数:
wc -l file.txt
#2、只统计文件的字节数:
wc -c file.txt
#3、统计多个文件的总行数、词数和字节数:
wc file1.txt file2.txt
#4、使用通配符统计某个目录下所有文件的行数:
wc -l /path/to/directory/*
2. 【tr】转换或删除字符
-
- 用于转换或删除文件中的字符。其名称来自于 "translate" 或 "transliterate",用于执行字符替换操作。
-
-
- 对于处理文件中的字符转换和删除操作非常有用,尤其在文本处理和数据清洗方面经常被使用。
-
-
- 基本语法
-
-
- tr [选项] SET1 [SET2]
-
-
- 常用选项
-
-
- 【-d, --delete】删除输入中出现在 SET1 中的字符。
- 【-s, --squeeze-repeats】将重复出现的字符压缩成单个字符。
- 【-c, --complement】取补集,即替换除 SET1 中指定的字符以外的所有字符。
- 【-t, --truncate-set1】仅使用 SET1 的前 N 个字符。
-
-
- 示例
#1、将文件中所有小写字母转换为大写字母:
tr '[:lower:]' '[:upper:]' < file.txt
#2、删除文件中的所有空格:
tr -d ' ' < file.txt
#3、将文件中的制表符替换为单个空格:
tr '\t' ' ' < file.txt
#4、将文件中的所有重复字符压缩成单个字符:
tr -s 'a-z' < file.txt
#5、将文件中的所有数字字符替换为 x:
tr '0-9' 'x' < file.txt
#6、将文件中所有非数字字符替换为 ?:
tr -c '0-9' '?' < file.txt
3. 【cut】提取文本列,将结果写入到标准输出
-
- 用于从文本文件或标准输入中提取文本列,并将结果写入到标准输出
-
-
- 通常用于处理以制表符或其他特定字符分隔的文本数据,可以方便地提取所需的字段或字符。
-
-
- 基本语法
-
-
- cut [选项] [文件]
-
-
- 常用选项
-
-
- 【-f, --fields=LIST】指定要提取的字段列表,列表以逗号分隔。
- 【-d, --delimiter=DELIM】指定字段分隔符,默认为制表符。
- 【-c, --characters=LIST】指定要提取的字符列表,列表以逗号分隔。
- 【--complement】补集,提取除指定列外的所有列。
-
-
- 示例
#1、提取文件的第一列:
cut -f1 file.txt
#2、提取文件的第二列和第四列:
cut -f2,4 file.txt
#3、使用逗号作为字段分隔符,提取文件的第三列:
cut -d',' -f3 file.csv
#4、提取文件的第1到5列:
cut -f1-5 file.txt
#5、提取文件的第1列和第5列到最后一列:
cut -f1,5- file.txt
#6、提取文件的第1个字符到第10个字符:
cut -c1-10 file.txt
#7、提取文件的第1个字符和第10个字符:
cut -c1,10 file.txt
#8、提取文件的除第3列外的所有列:
cut --complement -f3 file.txt
4. 【sort】行排序
-
- 用于对文本文件中的行进行排序。它默认按照字典顺序对文本行进行排序,并将结果写入标准输出。
- 基本语法
-
-
- sort [选项] [文件]
-
-
- 常用选项
-
-
- 【-r, --reverse】逆序排序。
- 【-n, --numeric-sort】按照数字值而不是按照字典顺序排序。
- 【-k, --key=POS1[,POS2]】指定以某列为键进行排序。POS1 和 POS2 是以 1 开始的列号。
- 【-t, --field-separator=SEP】指定字段分隔符,默认为制表符。
- 【-u, --unique】仅显示唯一行,去除重复行。
- 【-f, --ignore-case】忽略大小写进行排序。
-
-
- 示例
#1、对文件中的文本行进行排序:
sort file.txt
#2、对文件中的文本行进行逆序排序:
sort -r file.txt
#3、按照第二列的数字值进行排序:
sort -n -k2 file.txt
#4、指定逗号为字段分隔符,并按照第三列的字典顺序进行排序:
sort -t',' -k3 file.csv
#5、仅显示唯一行(去除重复行):
sort -u file.txt
#6、忽略大小写进行排序:
sort -f file.txt
5. 【uniq】删除重复的行
-
- 用于从排序过的文本输入中删除重复的行,并将结果输出到标准输出。
- 基本语法
-
-
- uniq [选项] [输入文件]
-
-
- 常用选项
-
-
- 【-c, --count】在每行输出前添加该行在输入文件中出现的次数。
- 【-d, --repeated】仅显示重复的行。
- 【-i, --ignore-case】在比较行时忽略大小写。
- 【-u, --unique】仅显示不重复的行。
- 【-f N, --skip-fields=N】在比较行时,忽略前 N 个字段。
- 【-s N, --skip-chars=N】在比较行时,忽略前 N 个字符。
-
-
- 示例
#1、去除重复行:
uniq file.txt
#2、统计重复行的出现次数:
uniq -c file.txt
#3、仅显示重复行:
uniq -d file.txt
#4、仅显示不重复的行:
uniq -u file.txt
#5、忽略大小写比较行:
uniq -i file.txt
#6、在比较行时,忽略前两个字段:
uniq -f2 file.txt
#7、在比较行时,忽略前五个字符:
uniq -s5 file.txt
6. 【rev】反转字符顺序
-
- 用于反转文本输入中每行的字符顺序,并将结果输出到标准输出。
- 基本语法
-
-
- rev [选项] [文件]
-
-
- 常用选项
-
-
- 【-V, --version】显示版本信息并退出。
- 【-h, --help】显示帮助信息并退出。
-
-
- 示例
#1、反转文件中每行的字符顺序:
rev file.txt
#2、结合管道从另一个命令的输出中反转字符顺序:
echo "hello world" | rev
#3、从文件中读取内容并反转字符顺序,然后将结果保存到新文件:
rev input.txt > output.txt
7. 课间作业:
要求把系统内GID最大的5个用户名显示出来
#1、使用 cut 命令从 /etc/passwd 文件中提取用户名和用户组ID。
#2、使用 sort 命令按照用户组ID进行排序。
#3、使用 uniq 命令去除重复的用户组ID。
#4、使用 tail 命令获取最后 5 行,这些行应该包含系统内 GID 最大的 5 个用户。
#5、使用 cut 命令提取用户名。
cut -d: -f1,4 /etc/passwd | sort -t: -nk2 | uniq | tail -n 5 | cut -d: -f1
-
- cut -d: -f1,4 /etc/passwd:从 /etc/passwd 文件中提取用户名和用户组ID,使用 : 作为字段分隔符。-f1,4 表示提取第一个和第四个字段,即用户名和用户组ID。
- sort -t: -nk2:对提取的结果进行排序。-t: 表示使用 : 作为字段分隔符,-nk2 表示按照第二个字段(用户组ID)进行数字排序。
- uniq:去除连续重复的行,即去除具有相同用户组ID的行。
- tail -n 5:获取最后 5 行,这些行应该包含系统内 GID 最大的 5 个用户。
- cut -d: -f1:从这 5 行中提取用户名,使用 : 作为字段分隔符,提取第一个字段。
4、管道操作
1. 管道(Pipeline)
-
- 连接两个或多个命令,其中一个命令的输出成为另一个命令的输入。
-
-
- 这种机制使得可以将多个简单的命令组合在一起,以实现更复杂的功能。
- 管道的符号是竖线符号 【|】。
- 优点在于它可以将简单的命令组合成复杂的操作,而无需使用临时文件来存储中间结果。
- 管道连接的每个命令都会在内存中缓存其输出,因此在处理大量数据时可能会占用大量系统资源。
-
-
- 基本语法
-
-
- command1 | command2 | command3 | ... | commandN
-
-
- 示例
-
-
- cat data.txt | grep "keyword" | sort | uniq
-
-
-
-
- cat data.txt 命令用于将 data.txt 文件的内容输出到标准输出。然后,grep "keyword" 命令用于筛选包含特定关键字的行。接着,sort 命令对筛选后的结果进行排序,最后,uniq 命令用于去除连续重复的行。
- 每个命令都通过管道接收前一个命令的输出,并对其进行处理。
-
-
-
- 被管道连接的命令必须能够从其标准输入中读取数据,并将结果输出到标准输出。
-
-
- cd ls find …… 不支持管道
-
-
- Linux——>程序=指令+数据,使用目的单一的小程序,组合小程序完成复杂的任务
2. 【tee】
-
- (分叉)从标准输入读取数据,并将其复制到标准输出和一个或多个文件中。
-
-
- 在需要同时查看输出并将其写入文件时使用
- 可能希望将命令的输出保存到日志文件中,同时在终端上查看输出
-
-
- 基本语法
-
-
- tee [OPTION]... [FILE]...
- 注意:tee命令默认输出为覆盖输出
-
-
- 常见选项
-
-
- 【-a, --append】将输出追加到文件而不是覆盖文件。
- 【-i, --ignore-interrupts】忽略中断信号(例如 Ctrl+C),继续运行。
- -p, --preserve】保留文件权限(默认情况下,tee 将文件的权限设置为默认值)
-
-
- 示例
#1、将命令的输出写入文件并显示在终端上:
command | tee output.txt
#2、将命令的输出追加到现有文件中:
command | tee -a output.txt
#3、将命令的输出写入多个文件:
command | tee file1.txt file2.txt file3.txt
5、linux的压缩和归档
- 压缩和归档,用于将文件或目录进行压缩以节省存储空间,或者将多个文件或目录打包成一个单独的文件
1. Linux中文件的压缩
- 为什么要压缩文件:
-
- 节约磁盘空间
- 高效、安全,操作方便
- 缺点:会额外消耗CPU资源
- 压缩和解压缩文件注意
-
- 不会保留源文件
- 默认有压缩级别(1-9 ),用于平衡压缩率和压缩速度。可以通过指定压缩级别来调整压缩效果,一般级别越高,压缩率越高,但同时也会消耗更多的 CPU 资源。
-
-
- 1为最低压缩级别(压的最浅),9级别最高(压的最狠),如果不指定级别,默认压缩级别为(6)
-
-
- 适用范围:
-
-
- gzip、bzip2、xz 这三种方式不能对目录做压缩
- tar 主要用于打包和压缩目录。
-
- Linux压缩工具
-
- compress/uncompress
-
-
- 压缩工具/解压缩工具
- 后缀名: 【.Z】
-
-
- gzip/gunzip=gzip -d
-
-
- 压缩工具/解压缩工具
- 后缀名: 【.gz】
-
-
- bzip2/bunzip2=bzip2 -d
-
-
- 压缩工具/解压缩工具
- 后缀名: 【.bz2】
-
-
- zip/unzip
-
-
- 后缀名: 【.zip】
- zip最小化安装没有
- 命令格式:zip [-r] 压缩后的文件 被压缩的文件
- unzip--->对应的解压缩工具(可以对文件和目录都压缩,此方式会保留源文件)
-
-
- xz/unxz=xz -d
-
-
- 后缀名: 【.xz】
-
-
- gzip 是最常用的压缩工具,具有较高的压缩率和相对较快的压缩速度。
- 需要更高压缩率的情况,使用 bzip2 或 xz。
- zip 用于创建和解压缩 ZIP 格式的压缩文件,适用于在不同操作系统之间进行文件传输。
-
- 示例
gzip example.txt # 压缩文件
gunzip example.txt.gz # 解压缩文件
bzip2 example.txt # 压缩文件
bunzip2 example.txt.bz2 # 解压缩文件
zip example.zip example.txt # 压缩文件
unzip example.zip # 解压缩文件
xz example.txt # 压缩文件
unxz example.txt.xz # 解压缩文件
2. Linux中的归档
- 归档:打包目录或者将多个离散文件归纳为一个普通文件。以便于传输、备份或存档。
-
- 注意:归档同时可以实现压缩
- 【tar】创建、查看和提取归档文件
-
- 也被称为 tarball。它能够将多个文件或目录组合成一个单独的文件,以便于传输、备份或存档
- 基本语法
-
-
- tar [选项] [归档文件] [文件或目录...]
-
-
- 常用选项
-
-
- 【-c, --create】创建归档文件
- 【-x, --extract, --get】提取归档文件内容
- 【-t, --list】列出归档文件内容
- 【-r, --append】向归档文件中追加文件
- 【-u, --update】仅添加归档文件中新于归档中已存在文件的文件
- 【-f, --file=ARCHIVE】指定归档文件的名称
- 【-v, --verbose】显示详细的操作信息
- 【-z, --gzip】使用 gzip 压缩/解压缩
- 【-j, --bzip2】使用 bzip2 压缩/解压缩
- 【-J】归档的同时,可以使用xz格式进行压缩或解压缩
- 【-C, --directory=DIR】在指定目录中执行操作
- 【-P, --absolute-names】使用绝对文件名(包括路径)
-
-
- 示例
#1、创建归档文件:
tar -cvf archive.tar file1 file2 directory1
#2、查看归档文件内容:
tar -tvf archive.tar
#3、提取归档文件内容:
tar -xvf archive.tar
#4、向归档文件中追加文件:
tar -rvf archive.tar file3
#5、压缩归档文件:
tar -cvzf archive.tar.gz directory1
#6、解压归档文件:
tar -xvzf archive.tar.gz
6、【find】用于在文件系统中搜索文件和目录
- 基本语法
-
- find [搜索路径] [选项] [表达式]
- find命令不支持管道,那我们可以使用xargs命令强行驱动使用管道
- 常用选项
-
- 查找条件:
-
-
- 【-name pattern】按照文件或目录名称进行查找,pattern 是一个 shell 通配符模式。
- 【-iname】类似于 -name,但是不区分大小写。
- 【-user username】按照文件所有者进行查找。
- 【-group groupname】按照文件所属组进行查找。
- 【-uid userID】按照用户 ID 进行查找。
- 【-gid groupID】按照组 ID 进行查找。
- 【-perm mode】按照文件权限进行查找,mode 是一个八进制数字,表示文件权限。
- 【-type type】按照文件类型进行查找,type 可以是 f(文件)、d(目录)、l(符号链接)等。
- 【-size】用于按文件大小查找文件
- 【-atime】用于按文件访问时间查找文件
- 【-mtime】用于按文件修改时间查找文件
- 【-ctime】用于按文件状态改变时间查找文件
-
-
- 逻辑运算
-
-
- 【-a】与逻辑运算,表示同时满足多个条件。
- 【-o】或逻辑运算,表示满足任意一个条件。
- 【-not】否定条件,表示查找不符合条件的文件。
-
-
- 处理动作
-
-
- 【-print】将搜索到的文件名打印到标准输出。
- 【-ls】类似于 ls -dils,显示详细信息。
- 【-delete】删除搜索到的文件。
- 【-fls file】将搜索到的文件列表保存到指定文件中,每行一个文件。
- 【-ok COMMAND {} \;】类似于 -exec,但在执行之前会询问用户是否执行指定命令。
- 【-exec COMMAND {} \;】对搜索到的文件执行指定的命令,{} 表示搜索到的文件名。
-
- 示例
#1、查找当前目录及其子目录下所有名称为 example.txt 的文件,并打印到标准输出
find . -name example.txt -print
#2、查找目录下所有属于 root 用户的文件,并将结果保存到指定文件中:
find /var/log -user root -fls log_files.txt
#3、查找 /tmp 目录下大于 1MB 的文件,并删除它们
find /tmp -type f -size +1M -delete
#4、查找 /home 目录下所有属于 users 组的目录,并对每个目录执行 ls -l 命令:
find /home -type d -group users -exec ls -l {} \;
#5、查找当前目录及其子目录下所有最近修改时间在 7 天以内的文件,并询问用户是否删除它们
find . -type f -mtime -7 -ok rm {} \;
#6、查找当前目录及其子目录下所有具有写权限的文件,并打印到标准输出:
7、vim编辑器
- Vim(Vi IMproved)是Unix和类Unix系统下的一款文本编辑器,通常在终端中使用。它是从Vi发展而来的,具有更多的功能和改进。Vim具有高度可定制性、强大的编辑功能和丰富的插件生态,因此被广泛用于程序开发、系统管理和文本编辑等领域。
- vim命令的使用格式
-
- vim [options] /path/to/file
1. 三种主要模式
-
- 命令模式(Normal Mode 或者编辑模式)
-
-
- 这是默认的模式,在这个模式下,可以执行各种编辑操作和命令,例如移动光标、删除文本、复制粘贴等。
- 在命令模式下,按下冒号(:)键可以切换到末行模式。
-
-
- 插入模式(Insert Mode 或者输入模式)
-
-
- 在这个模式下,可以直接输入文本内容。按下键盘上的字母和符号会直接插入到文本中,而不是执行编辑命令。
- 从命令模式进入插入模式的方式是按下 i、I、a、A、o 或者 O 键。
-
-
- 末行模式(Command-Line Mode 或者命令接口)
-
-
- 这个模式用于执行一些高级的编辑命令和设置。比如保存文件、退出 Vim、执行搜索替换等操作。
- 在命令模式下按下冒号(:)键,就会进入末行模式。
-
2. 模式切换
3. vi/vim 使用实例
-
- 使用 vi/vim 进入一般模式,使用 【vim】 来建立一个名为 runoob.txt 的文件
-
-
- $ vim runoob.txt
-
-
- 按下 【i】 进入输入模式(也称为编辑模式),开始编辑文字
-
-
- 在一般模式之中,只要按下 i, o, a 等字符就可以进入输入模式了!
- 在编辑模式当中,可以发现在左下角状态栏中会出现 –INSERT- 的字样,那就是可以输入任意字符的提示。
- 这个时候,键盘上除了 Esc 这个按键之外,其他的按键都可以视作为一般的输入按钮了,所以可以进行任何的编辑。
-
-
- 按下 【ESC】 按钮回到一般模式
-
-
- 退出,按下 Esc 这个按钮即可!马上就会发现画面左下角的 – INSERT – 不见了!
-
-
- 在一般模式中按下 【:wq】 储存后离开 vi
-
- 这样就成功创建了一个 runoob.txt 的文件
4. 命令/编辑模式下_常用的几个命令
-
- 此状态下敲击键盘动作会被 Vim 识别为命令,而非输入字符,比如我们此时按下【i】,并不会输入一个字符,【i】被当作了一个命令。
- 移动光标:
-
-
- 使用【箭头键】或 【h】、【j】、【k】、【l】 键进行上下左右移动。
- 使用 【w】 命令向前移动一个单词。
- 使用 【b】 命令向后移动一个单词。
- 使用 【0】 命令移动到当前行的行首。
- 使用 【$】 命令移动到当前行的行尾。
- 使用 【gg】 命令移动到文件的第一行。
- 使用 【G】 命令移动到文件的最后一行。
- 使用 【<行号>G】 命令移动到指定行号的行。
-
-
- 插入文本:
-
-
- 按下 【i】 键进入插入模式,在当前光标位置插入文本。
- 按下 【I】 键在当前行的行首进入插入模式。
- 按下 【a】 键在当前光标后插入文本。
- 按下 【A】 键在当前行的行尾插入文本。
- 按下 【o】 键在当前行的下方插入新的一行,并进入插入模式。
- 按下 【O】 键在当前行的上方插入新的一行,并进入插入模式。
-
-
- 删除和修改文本:
-
-
- 按下 【x】 键删除光标处的字符。
- 按下 【dd】 键删除当前行。
- 按下 【dw】 键删除一个单词。
- 使用 【p】 命令在光标后粘贴删除的内容。
- 使用 【u】 命令撤销上一次操作。
- 使用 【Ctrl + r】 命令恢复上一次被撤销的操作。
-
-
- 复制和粘贴文本:
-
-
- 使用 【yy】 命令复制当前行。
- 使用 【yw】 命令复制一个单词。
- 使用 【y】 命令和移动光标命令一起使用来复制文本。
- 使用 【p】 小p,命令在光标后粘贴复制的文本。
- 使用 【P】 大p,命令在光标前粘贴复制的文本。
-
-
- 查找和替换:
-
-
- 按下 【/】 键进入搜索模式,输入要搜索的字符串,按下 【Enter】 键查找。
- 使用 【n】 命令继续向后查找匹配项。
- 使用 【N】 命令向前查找匹配项。
- 按下 【:】 键进入命令模式,输入 【s/old/new/g】 替换所有匹配的字符串。
-
5. 输入/插入模式下_常用的几个命令
-
- 在命令模式下按下【i】就进入了输入模式,使用 【Esc】 键可以返回到普通模式。
- 普通文本插入:
-
-
- 直接键入要插入的文本即可。
-
-
- 插入特殊字符:
-
-
- 按下 【Ctrl + v】 键,然后键入【特殊字符的 ASCII 码】。
-
-
- 换行插入:
-
-
- 按下 【Enter】 键换行插入新文本。
-
-
- 删除文本:
-
-
- 使用 【Backspace】 键删除前一个字符。
- 使用 【Delete】 键删除后一个字符。
-
-
- 移动光标:
-
-
- 使用【方向键】或 【h】、【j】、【k】、【l】 键移动光标。
-
-
- 撤销操作:
-
-
- 按下 【Ctrl + z】 键撤销上一次的插入操作。
-
-
- 退出插入模式:
-
-
- 按下 【Esc】 键退出插入模式,返回到普通模式。
-
6. 末行模式/命令行模式下_常用的几个命令
-
- 保存文件:
-
-
- 输入 【:w】 并按下 【Enter】 键,保存当前文件。
-
-
- 退出 Vim:
-
-
- 输入 【:q】 并按下 【Enter】 键,退出 Vim 编辑器。
- 如果文件有未保存的修改,使用 【:q!】 可以强制退出而不保存。
-
-
- 保存并退出:
-
-
- 输入 【:wq】 并按下 【Enter】 键,保存当前文件并退出 Vim。
-
-
- 搜索文本:
-
-
- 输入 【/】,然后输入要搜索的文本,按下 【Enter】 键进行搜索。
- 使用 【n】 键和 【N】 键分别在下一个和上一个匹配项之间进行导航。
-
-
- 替换文本:
-
-
- 输入 【:%s/old_text/new_text/g】 并按下 【Enter】 键,将文件中所有的 【old_text】 替换为 【new_text】。
-
-
- 移动光标:
-
-
- 使用 【:n】 命令(其中 n 为行号)跳转到文件的第 n 行。
-
-
- 显示行号:
-
-
- 输入 【:set number】 并按下 【Enter】 键,显示行号。
- 输入 【:set nonumber】 并按下 【Enter】 键,隐藏行号。
-
-
- 撤销操作:
-
-
- 输入 【:u】 并按下 【Enter】 键,撤销上一次的操作。
-
-
- 帮助文档:
-
-
- 输入 【:help】 并按下 【Enter】 键,打开 Vim 的帮助文档。
-
7. 定制vim的工作特性
- 定制 Vim 的工作特性可以使编辑体验更加高效和舒适。通过编辑 .vimrc 文件,可以永久性地设置 Vim 的各种选项和行为。以下是一些常见的 Vim 定制选项:
-
- 显示行号:
-
-
- 启用行号:【:set nu】
- 禁用行号:【:set nonu】
-
-
- 忽略大小写:
-
-
- 启用忽略大小写搜索:【:set ignorecase】
- 禁用忽略大小写搜索:【:set noignorecase】
-
-
- 自动缩进:
-
-
- 启用自动缩进:【:set autoindent】
- 禁用自动缩进:【:set noautoindent】
-
-
- 复制保留格式:
-
-
- 启用粘贴模式:【:set paste】
- 禁用粘贴模式:【:set nopaste】
-
-
- 显示换行符:
-
-
- 启用显示换行符:【:set list】
- 禁用显示换行符:【:set nolist】
-
-
- 高亮搜索:
-
-
- 启用搜索高亮:【:set hlsearch】
- 禁用搜索高亮:【:set nohlsearch】
-
-
- 设置缩进:
-
-
- 设置缩进宽度为 4 个空格:【:set shiftwidth=4】
-
-
- Tab 替换为空格:
-
-
- 设置 Tab 键宽度为 4 个空格:【:set tabstop=4】
-
-
- 设置光标所在行的标识线:
-
-
- 启用光标标识线:【:set cursorline】
- 禁用光标标识线:【:set nocursorline】
-
-
- 加密文本:
-
-
- 设置加密密码:【:set key=password】
-
- 注意事项:
-
- vim编辑器不能同时将同一个文本文件打开两次或以上,否则会出现交换文件。
- 记得保存 .vimrc 文件并重新启动 Vim 才能使更改生效。