写在前面:
最近在学习Linux命令,记录一下学习Linux常用命令的过程,方便以后复习。仅供参考,若有不当的地方,恳请指正。如果对你有帮助,欢迎点赞,关注,收藏,评论,谢谢。
1. grep命令 用于查找文件里符合条件的字符串或正则表达式
1.1 基本语法
grep [options] pattern [files]
pattern - 表示要查找的字符串或正则表达式。
files - 表示要查找的文件名,可以同时查找多个文件,如果省略 files 参数,则默认从标准输入中读取数据。
1.2 常用选项
-i:对应单词 "ignore"(忽略)。这个选项告诉 grep 在搜索时忽略大小写,即大小写不敏感。
意义:搜索时不会区分大写字母和小写字母,如 "error" 和 "Error" 会被视为相同。
-v:对应单词 "invert"(反转)。这个选项反转了 grep 的默认行为,即只打印不匹配指定模式的行。
意义:通常 grep 用来打印匹配的行,但 -v 选项使其打印不匹配的行。
-n:对应单词 "number"(数字或编号)。这个选项告诉 grep 在输出匹配行时,前面加上该行在文件中的行号。
意义:帮助用户快速定位到匹配内容在文件中的位置。
-r 或 -R:对应单词 "recursive"(递归)。这个选项告诉 grep 在目录及其子目录中递归地搜索文件。
意义:当需要在整个目录树中搜索文件时,可以使用这个选项。
-l:对应单词 "list"(列表)。这个选项告诉 grep 只打印包含匹配内容的文件名,而不是匹配的内容本身。
意义:当只关心哪些文件包含匹配内容时,可以使用这个选项。
-c:对应单词 "count"(计数)。这个选项告诉 grep 只打印匹配的行数,而不是匹配的内容本身。
意义:当只需要知道匹配内容的数量时,可以使用这个选项。
1.3 grep 111 1.txt 查找“111”,并打印匹配行
PS:grep -n (number)111 1.txt 查找“111”,并打印匹配行和行号
1.4 grep -r -n 1 .(当前目录)在当前文件夹中递归查找所有文件中匹配正则表达式 "1" 的行,并打印匹配行所在的文件名和行号
1.5 echo "hello world" | grep -c world 在标准输入中查找字符串 "world",并只打印匹配的行数
grep 在输入字符串 "hello world" 中找到了 "world" 这个子字符串,因此 -c(count) 选项会使 grep 输出 1,表示找到了一个匹配项。
1.6 grep 2 *txt 在当前目录中,查找后缀有 txt字样的文件中包含 ‘2’字符串的文件,并打印出该字符串的行
1.7 grep -v [0-9] *txt* 反向查找,查找不包含数字的文件,并打印匹配行
2. sed命令 利用脚本来处理文本文件
sed 可以被理解为 "stream editor" 的缩写,即流编辑器。
sed 可依照脚本的指令来处理、编辑文本文件。
sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
2.1 基本语法
sed [-hnV][-e<script>][-f<script文件>][文本文件]
参数说明:
-e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
-f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
-h或--help 显示帮助。
-n或--quiet或--silent 仅显示script处理后的结果。
-V或--version 显示版本信息。
动作说明:
a:append(追加)
功能:在指定行之后追加新的文本。
示例:在文件的第一行后追加“Hello, World!”:sed '1a Hello, World!' filename
c:change(更改)
功能:替换指定行(或范围)的文本内容。
示例:将文件的第3行替换为“New line”:sed '3c New line' filename
d:delete(删除)
功能:删除指定的行。
示例:删除文件的第1行:sed '1d' filename
i:insert(插入)
功能:在指定行之前插入新的文本。
示例:在文件的第一行前插入“Start here”:sed '1i Start here' filename
p:print(打印)
功能:打印出指定的行。通常与 -n 选项一起使用,以仅打印出匹配的行。
示例:打印出文件的第二行:sed -n '2p' filename
s:substitute(替换)
功能:在文本中执行替换操作。可以搭配正则表达式进行复杂的替换。
示例:将文件中的“old”替换为“new”:
注意:s/old/new/g 中的 g 表示全局替换,即替换每一行中的所有匹配项。如果不加 g,则只替换每行中的第一个匹配项。
2.2 sed -e 4a\Newline testfile.txt 在 testfile.txt的第四行后添加一行,并将结果输出到标准输出
2.3 nl testfile.txt | sed '2,5d' 将 testfile.txt 的内容列出并且列印行号,同时,请将第 2~5 行删除
只删除某一行,如:nl testfile.txt | sed '9d' (只删除第9行)
删除某一行到最后一行,如:nl testfile.txt | sed '3,$d'(删除3-最后一行)
2.4 sed 's/Linux/LINUX/g' testfile.txt 将testfile.txt文件中的 "Linux" 替换成 "LINUX"
但是,我们可以看到它其实并没有修改原文件,如果我们想直接把修改的结果保留在原文件,应该怎么操作?
可以使用 -i(in-place)选项,将结果保留在原文件。
2.5 sed -i '/^$/d' 01.txt 从01.txt文件中删除所有空白行
相关解释:
'/^$/d': 这是一个 sed 表达式,用于指定一个操作。
^$: 这是一个正则表达式,用于匹配空行。^ 表示一行的开始,$ 表示一行的结束。当它们之间没有任何字符时,这个正则表达式就会匹配那些没有任何字符(即空)的行。
d: 这是一个 sed 命令,表示删除匹配到的行。
2.6 sed -i '/*#/d;/^$/d' 01.txt 从01.txt文件中删除所有注释和空白行
2.7 echo 'esempio' | tr '[:lower:]' '[:upper:]' 将小写字母转换为大写字母
相关解释:
echo 'esempio':这个命令用于输出字符串 'esempio' 到标准输出(通常是终端)。
|:这是 Unix 和 Linux 中的管道符号,它用于将一个命令的输出作为另一个命令的输入。在这个例子中,echo 命令的输出(即字符串 'esempio')被传递给 tr 命令。
tr '[:lower:]' '[:upper:]':tr 命令用于替换或删除输入中的字符。在这里,它使用字符类 [:lower:] 和 [:upper:] 来指定要替换的字符范围。[:lower:] 匹配所有小写字母,[:upper:] 匹配所有大写字母。tr 命令将这些小写字母替换为对应的大写字母。
因此,整个命令 echo 'esempio' | tr '[:lower:]' '[:upper:]' 的输出将是 'ESEMPIO',即原始字符串 'esempio' 的大写形式。
扩展:
tr 对应于英文单词 "translate" 的缩写,表示“转换”或“翻译”。
2.8 sed -n '/22/p' 02.txt 查看只包含词汇 "22"的行
2.9 sed -e 's/ *$//' 02.txt 删除每一行最后的空白字符
当你从文件的每一行末尾删除空格或制表符时,这些更改在纯文本编辑器或命令行查看时可能并不明显,因为这些字符是“不可见的”。但是,这些字符的存在可能会在某些情况下产生问题,特别是在处理文本文件、脚本、配置文件或与其他系统交互时。
因此,使用 sed -e 's/ *$//' 02.txt 来删除行尾的空白字符可以确保文件更加干净、一致,并减少潜在的问题。即使这些更改在直接查看时可能不明显,但它们仍然是有益的。
2.10 sed -e 's/22//g' 02.txt 从文档中只删除词汇 "22" 并保留剩余全部
//: 替换字符串部分。在这里它是空的,意味着匹配到的内容(即 22)将被替换为空(即被删除)。
2.11 sed -n '1,5p;5q' 02.txt 查看从第一行到第5行内容
'1,5p;5q': 这是一个 sed 脚本,包含两个命令,用分号 ; 分隔。
1,5p: 这个命令告诉 sed 打印从第一行到第五行的内容。1,5 是一个地址范围,表示从第一行到第五行。p 是一个命令,用于打印当前模式空间的内容。由于我们使用了 -n 选项,因此这个 p 命令实际上是我们唯一看到模式空间内容的方式。
5q: 这个命令告诉 sed 在处理完第五行后退出。q 是一个命令,用于退出 sed。由于我们指定了地址 5,因此 sed 会在处理完第五行后立即退出,不再继续处理文件的其余部分。
2.12 sed -n '5p;5q' 02.txt 查看第5行
sed -n '5p;5q' 02.txt 和 sed -n '5p' 02.txt 的区别:
1.两个命令都会打印出文件的第五行内容。
2.sed -n '5p' 02.txt 会继续处理文件的其余部分,但由于没有打印命令,所以你不会看到其他行的内容。
3.sed -n '5p;5q' 02.txt 会在打印第五行后立即退出,不再处理文件的其余部分。虽然结果相同,但这个命令有一个额外的退出步骤。
在大多数情况下,如果你只是想要打印文件的第五行,那么使用 sed -n '5p' 02.txt就足够了。但如果你想要确保在打印第五行后立即退出(例如,为了避免处理大文件时的额外开销),那么可以使用 sed -n '5p;5q' 02.txt。