Linux四剑客
Linux 中的 find、grep、sed、awk 是非常强大和常用的命令行工具,用于处理文件和文本,被称为Linux四剑客。下面是它们的详细教程:
find 命令
find 命令:用于查找文件和目录。常用的语法如下:
find [path] [options] [expression]
- [path]:指定需要查找的路径。
- [options]:可选参数,用于设置查找条件,例如
-name
指定按照文件名进行匹配。 - [expression]:可选参数,用于进一步过滤查找结果。
find 命令是 Linux 中用于查找文件和目录的强大工具,它有很多参数可以帮助你指定查找的条件。下面是一些常用的 find 命令参数和案例:
1.-name
:按照文件名匹配查找。例如:
find /path/to/dir -name "*.txt"
上述命令会在 /path/to/dir 目录下查找所有扩展名为 .txt 的文件。
2.-type
:按照文件类型匹配查找。例如:
find /path/to/dir -type f
上述命令会在 /path/to/dir 目录下查找所有普通文件。
-type查找某一类型的文件,诸如:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
3.-size
:按照文件大小匹配查找。例如:
find /path/to/dir -size +1M
上述命令会在 /path/to/dir 目录下查找大于 1MB 的文件。
4.-mtime
:按照文件修改时间匹配查找。例如:
find /path/to/dir -mtime -7
上述命令会在 /path/to/dir 目录下查找最近 7 天内修改过的文件。
5.-exec
:对查找到的文件执行指定的命令。例如:
find /path/to/dir -name "*.txt" -exec rm {} \;
上述命令会在 /path/to/dir 目录下查找所有扩展名为 .txt 的文件,并执行 rm 命令删除它们。
6.-maxdepth
:指定查找的最大深度。例如:
find /path/to/dir -maxdepth 2 -name "*.txt"
上述命令会在 /path/to/dir 目录下最多深度为 2 的子目录中查找所有扩展名为 .txt 的文件。
7.-empty
:查找空文件或空目录。例如:
find /path/to/dir -empty
上述命令会在 /path/to/dir 目录下查找所有空文件或空目录。
8.-perm
:按照文件权限匹配查找。例如:
find /path/to/dir -perm 644
上述命令会在 /path/to/dir 目录下查找文件权限为 644 的文件。
9.-user
和 -group
:按照文件属主和所属组匹配查找。例如:
find /path/to/dir -user username
上述命令会在 /path/to/dir 目录下查找属主为 username 的文件。
10.-iname
:按照文件名匹配查找,不区分大小写。例如:
find /path/to/dir -iname "*.jpg"
上述命令会在 /path/to/dir 目录下查找扩展名为 .jpg 的文件,不论大小写。
11.-execdir
:与 -exec
类似,但在执行命令时会进入到文件所在的目录。例如:
find /path/to/dir -name "*.txt" -execdir mv {} ../ \;
上述命令会在 /path/to/dir 目录下查找所有扩展名为 .txt 的文件,并将它们移动到父目录。 好的,这里还有一些 find 命令的参数和案例:
12.-regex
:按照正则表达式匹配查找。
".":匹配任意单个字符。
"^":匹配行的开头。
"$":匹配行的结尾。
"*":匹配前一个字符的零个或多个实例。
"+":匹配前一个字符的一个或多个实例。
"?":匹配前一个字符的零个或一个实例。
"[]":用于指定字符集合,例如 [abc] 匹配字母 a、b 或 c。
"a|b":用于匹配 a 或 b 中的一个。
"{n}":匹配前一个字符的 n 次。
"{n,m}":匹配次数,最少 n 次,最多 m 次。
"{n,}":匹配前一个字符的至少 n 次。
"()":分组匹配
find /path/to/dir -regex ".*\.(jpg|png)"
find -regex
是一个在 Linux 命令行中使用的命令,用于根据正则表达式查找匹配的文件或目录。下面是几个 find -regex
的案例:
1.查找以 .txt
结尾的文件:
find /path/to/directory -regex '.*\.txt$'
2.查找以数字开头的文件:
find /path/to/directory -regex '.*/[0-9].*'
3.查找以字母开头,后跟数字和字母的文件:
find /path/to/directory -regex '.*/[a-zA-Z][0-9a-zA-Z].*'
4.查找包含特定字符串的文件名:
find /path/to/directory -regex '.*keyword.*'
请注意,在使用 find -regex
时,正则表达式是针对整个路径的,包括目录和文件名。
上述命令会在 /path/to/dir 目录下查找所有扩展名为 jpg 或 png 的文件。
13.-newer
:按照文件修改时间比指定文件更新的时间匹配查找。例如:
find /path/to/dir -newer file.txt
上述命令会在 /path/to/dir 目录下查找所有修改时间比 file.txt
更新的文件。
14.-delete
:查找到的文件删除。例如:
find /path/to/dir -name "*.bak" -delete
上述命令会在 /path/to/dir 目录下查找所有扩展名为 .bak 的文件,并将它们删除。
15.-print
:将查找到的文件名打印出来。例如:
find /path/to/dir -name "*.log" -print
上述命令会在 /path/to/dir 目录下查找所有扩展名为 .log 的文件,并将它们的路径和文件名打印到终端上。
16.-printf
:指定打印格式。例如:
find /path/to/dir -printf "%p %s\n"
上述命令会在 /path/to/dir 目录下查找所有文件,并以 <文件路径> <文件大小>
的格式打印。
Grep命令
grep 命令:用于在文件中搜索匹配的文本模式。常用的语法如下:
grep [options] pattern [file...]
- [options]:可选参数,用于设置搜索条件,例如
-i
指定搜索时忽略大小写。 - pattern:要搜索的文本模式,可以是普通字符串或正则表达式。
- [file...]:可选参数,指定要搜索的文件列表。
当使用 grep
命令时,可以使用以下一些常用的参数和案例:
1.-i
:忽略大小写匹配。例如:
grep -i "keyword" file.txt
上述命令会在 file.txt 文件中查找出现的关键词 "keyword",不区分大小写。
2.-r
:递归查找目录中的文件。例如:
grep -r "keyword" /path/to/dir
上述命令会在 /path/to/dir 目录及其子目录中查找出现的关键词 "keyword"。
3.-v
:只显示不匹配的行。例如:
grep -v "keyword" file.txt
上述命令会在 file.txt 文件中查找不包含关键词 "keyword" 的行,并将其显示出来。
4.-n
:显示匹配行的行号。例如:
grep -n "keyword" file.txt
上述命令会在 file.txt 文件中查找包含关键词 "keyword" 的行,并显示行号。
5.-w
:仅匹配完整单词。例如:
grep -w "keyword" file.txt
上述命令会在 file.txt 文件中查找包含完整单词 "keyword" 的行。
6.-E
:使用扩展正则表达式。例如:
grep -E "key(word|phrase)" file.txt
上述命令会在 file.txt 文件中查找包含 "keyword" 或 "keyphrase" 的行。
7.-f
:从文件中读取模式,一行一个。例如:
grep -f patterns.txt file.txt
上述命令会从 patterns.txt 文件中读取模式,然后在 file.txt 文件中查找匹配的行。
8.-c
:只显示匹配行的数量。例如:
grep -c "keyword" file.txt
上述命令会在 file.txt 文件中查找包含关键词 "keyword" 的行,并且只输出匹配的行数。
9.-l
:只显示包含匹配行的文件名。例如:
grep -l "keyword" /path/to/dir/*
上述命令会在 /path/to/dir 目录下查找包含关键词 "keyword" 的文件,并只输出包含匹配行的文件名。
10.-L
:只显示不包含匹配行的文件名。例如:
grep -L "keyword" /path/to/dir/*
上述命令会在 /path/to/dir 目录下查找不包含关键词 "keyword" 的文件,并只输出不包含匹配行的文件名。
11.--exclude
:排除指定类型的文件。例如:
grep "keyword" /path/to/dir/* --exclude=*.log
上述命令会在 /path/to/dir 目录下查找出现的关键词 "keyword",但是排除掉 .log 文件中的出现。
sed命令
sed 命令:用于编辑和转换文本。它通常与正则表达式一起使用。常用的语法如下:
sed [options] 'script' [file...]
- [options]:可选参数,用于设置编辑操作,例如
-e
指定多个编辑操作。 - 'script':sed 脚本,包含一系列编辑命令和正则表达式。
- [file...]:可选参数,指定要进行编辑的文件列表。
注意 参数 -i :直接修改读取的文件内容,而不是输出到终端。
编辑命令
1.'s'表示替换文件中的文本,'g'表示全局:
sed 's/old_text/new_text/g' file.txt
上述命令中,将会用 new_text 替换 file.txt 文件中所有的 old_text 字符串。
2.'d'表示删除文件中的指定行:
sed '3d' file.txt
上述命令中,将会删除 file.txt 文件中的第三行。
3.'e'将多个命令一起使用:
sed -e 's/old_text/new_text/g' -e 's/another_old_text/another_new_text/g' file.txt
上述命令中,将会使用多个 sed 命令来替换文件中的文本。
4.'d'只显示删除或替换文本的行:
sed -n '/old_text/d' file.txt
上述命令仅显示 file.txt 文件中替换或删除了 old_text 的行,但不显示其他行。
5.'i'在匹配行之前或之后添加文本:
sed '/old_text/i new_text' file.txt
上述命令中,将会在 file.txt 文件中 old_text 出现的每一行之前添加 new_text,而不会影响其他行。
6.'a'只在匹配行之后添加文本:
sed '/old_text/a new_text' file.txt
上述命令中,将会在 file.txt 文件中 old_text 出现的每一行之后添加 new_text,而不会影响其他行。
7.删除每行前导和尾随空格:
sed 's/^[ \t]*//;s/[ \t]*$//' file.txt
上述命令将会删除每一行的前导和尾随空格,以便在后续处理中更方便。
8.删除空白行:
sed '/^$/d' file.txt
上述命令将会删除 file.txt 文件中的所有空白行。
9.根据表达式删除多行:
sed '/start_pattern/,/end_pattern/d' file.txt
上述命令将会删除 file.txt 文件中出现在 start_pattern 和 end_pattern 之间的所有行。
10.用行号替换所有行:
sed = file.txt | sed 'N;s/\n/\t/'
上述命令将会添加行号并将其与文件中的文本分隔开来,这在处理大型文本文件时非常有用。
11.将行中特定位置的字符替换为其他字符:
sed 's/\(.\{m\}\)./\1x/' file.txt
上述命令将会替换 file.txt 文件每一行的第 m 个字符为字符 "x"。
awk命令
awk 命令:用于处理和操作文本文件,支持强大的文本分析功能。它可以用于处理结构化的文本数据,还可以数据提取、转换、处理等。常用的语法如下:
awk 'pattern { action }' [file...]
- pattern:用于匹配文本行的模式,可以是正则表达式。
- action:执行的操作,可以是打印行、运算、字符串处理等。
- [file...]:可选参数,指定要处理的文件列表。
1.打印文件中的每一行:
awk '{print}' file.txt
上述命令将会打印 file.txt 文件中的每一行。
2.打印指定列的内容:
awk '{print $2}' file.txt
上述命令将会打印 file.txt 文件中的第二列数据。
3.根据条件过滤行:
awk '/pattern/' file.txt
上述命令将会打印 file.txt 文件中包含指定模式(pattern)的行。
4.根据指定条件打印行:
awk '$3 > 10' file.txt
上述命令将会打印 file.txt 文件中第三列大于 10 的行。
5.计算列的总和:
awk '{sum += $1} END {print sum}' file.txt
上述命令将会计算 file.txt 文件中第一列的总和,并打印结果。
6.根据指定的分隔符处理行:
awk -F',' '{print $2}' file.csv
上述命令将会以逗号作为分隔符,打印 file.csv 文件中的第二列数据。
7.处理多个文件:
awk '{print FILENAME, $0}' file1.txt file2.txt
上述命令将会逐行打印 file1.txt 和 file2.txt 文件的内容,并在每行前面加上文件名。
8.执行多个操作:
awk '{print $1, $NF} file.txt'
上述命令将会打印 file.txt 文件中的第一列和最后一列。
9.根据条件执行操作:
awk '{if ($2 > 10) print $1}' file.txt
上述命令将会打印 file.txt 文件中第二列大于 10 的行的第一列数据。
10.对多个文件进行操作:
awk '{print $1}' file1.txt file2.txt
上述命令将会打印 file1.txt 和 file2.txt 文件中的第一列数据。
11.自定义分隔符:
awk -F':' '{print $1, $NF}' /etc/passwd
上述命令将会打印 /etc/passwd 文件中的第一列和最后一列,并以冒号作为分隔符。
12.合并数据:
awk 'NR==FNR{a[$1]=$2; next} {print $1,$2,a[$1]}' file1.txt file2.txt
上述命令将会将 file1.txt 和 file2.txt 文件中的数据按照第一列合并,并打印第一列、第二列和第二个文件中每一行对应的第二列数据。
它们有更多的选项和功能。你可以通过 man
命令查看它们的详细文档,例如 man find
、man grep
、man sed
、man awk
。