Linux四剑客


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 findman grepman sedman awk