linux命令大全:
准备:seq
Linux的seq命令是一个用于生成序列化数字的命令,它可以根据指定的参数输出一系列连续的数字。seq命令的语法和功能可以通过以下方式进行概括:
-
基本语法:
-
seq
可以用来输出从FIRST
到LAST
之间的所有数字,也可以指定步长INCREMENT
来输出等差数列。 -
命令的基本格式包括:
-
seq LAST
:输出从1到LAST
的数字。 -
seq FIRST LAST
:输出从FIRST
到LAST
的数字。 -
seq FIRST INCREMENT LAST
:输出从FIRST
开始,以INCREMENT
为步长到LAST
的数字。
-
-
-
选项:
-
-f
,--format=FORMAT
:使用printf样式的浮点格式输出数字。 -
-s
,--separator=STRING
:使用指定的字符串作为数字之间的分隔符,默认是换行符。 -
-w
,--equal-width
:通过在数字前添加前导零来使每列数字宽度相等。
-
-
实例:
-
输出1到5的数字:
seq 5
或seq 1 5
(默认情况下,数字之间用换行符分隔)。 -
指定空格为分隔符输出2到8:
seq -s' ' 2 8
。 -
输出10以内的奇数:
seq -s' ' 1 2 10
,其中2为增量。 -
指定输出位数为2位,且不足部分补0:
seq -f"%02g" 8 12
(注意这里的格式化字符串是针对整数,如果需要针对浮点数则使用%f
等 %02g表示两位输出,不足两位默认补空格)。
-
seq命令在Linux系统中非常有用,尤其是在需要快速生成一系列数字或序列时。通过结合使用不同的选项和参数,可以灵活地生成所需的数字序列
1.1 管道命令
管道是由两个或多个命令组成的,前一个命令的输出作为后一个命令的输入
Linux管道命令是 “ | ”,其作用是用来连接多条指令,前一条指令的输出流会作为后一条指令的操作对象,其命令格式为“指令1 | 指令2 | …”,该命令的后一条指令,必须能够接收标准输入流命令才能执行。
它只能处理由前面一条指令传出的正确输出信息,对错误信息是没有直接处理能力的。然后,传递给下一条指令,作为操作对象。\
07_Shell管道命令及脚本调试
课程回顾
本章重点
一、管道命令
linux命令大全:
https://www.runoob.com/linux/linux-command-manual.html
准备:seq
Linux的seq命令是一个用于生成序列化数字的命令,它可以根据指定的参数输出一系列连续的数字。seq命令的语法和功能可以通过以下方式进行概括:
-
基本语法:
-
seq
可以用来输出从FIRST
到LAST
之间的所有数字,也可以指定步长INCREMENT
来输出等差数列。 -
命令的基本格式包括:
-
seq LAST
:输出从1到LAST
的数字。 -
seq FIRST LAST
:输出从FIRST
到LAST
的数字。 -
seq FIRST INCREMENT LAST
:输出从FIRST
开始,以INCREMENT
为步长到LAST
的数字。
-
-
-
选项:
-
-f
,--format=FORMAT
:使用printf样式的浮点格式输出数字。 -
-s
,--separator=STRING
:使用指定的字符串作为数字之间的分隔符,默认是换行符。 -
-w
,--equal-width
:通过在数字前添加前导零来使每列数字宽度相等。
-
-
实例:
-
输出1到5的数字:
seq 5
或seq 1 5
(默认情况下,数字之间用换行符分隔)。 -
指定空格为分隔符输出2到8:
seq -s' ' 2 8
。 -
输出10以内的奇数:
seq -s' ' 1 2 10
,其中2为增量。 -
指定输出位数为2位,且不足部分补0:
seq -f"%02g" 8 12
(注意这里的格式化字符串是针对整数,如果需要针对浮点数则使用%f
等 %02g表示两位输出,不足两位默认补空格)。
-
seq命令在Linux系统中非常有用,尤其是在需要快速生成一系列数字或序列时。通过结合使用不同的选项和参数,可以灵活地生成所需的数字序列
1.1 管道命令
管道是由两个或多个命令组成的,前一个命令的输出作为后一个命令的输入
Linux管道命令是 “ | ”,其作用是用来连接多条指令,前一条指令的输出流会作为后一条指令的操作对象,其命令格式为“指令1 | 指令2 | …”,该命令的后一条指令,必须能够接收标准输入流命令才能执行。
它只能处理由前面一条指令传出的正确输出信息,对错误信息是没有直接处理能力的。然后,传递给下一条指令,作为操作对象。
基本格式:
指令1 | 指令2 | …
注意:
1、管道命令只能处理前一条指令的正确输出,不能处理错误输出;
2、管道命令的后一条指令,必须能够接收标准输入流命令才能执行。
seq 20 100 | head -n 50 | tail -n 1
1.2 分类
管道可以分为以下几种类型:
标准管道(stdin、stdout、stderr):通过文件描述符进行通信,通常使用|
表示。
命名管道(named pipe):也称为FIFO(First In First Out),可以通过文件名进行通信。
匿名管道(anonymous pipe):也称为PTY(Process Terminal),用于进程间通信。
1.3 常用管道命令
在Linux中,常用的管道命令有:
-
选取命令:cut、grep
-
排序命令:sort wc uniq
-
双向重定向:tee
-
字符转换命令: tr, col, join, paste, expand
-
切割命令:split
-
参数代号:xargs
1.3.1 选取命令:cut、grep
选取就是将一段数据经过分析后,获取需要的数据
-
cut:以行为单位,将一段信息的某一片段信息切出来
-
grep:分析所需信息,取得所需信息所在行
cut
格式:
cut -d '分割字符' -f fields cut -c 字符区间
Cut命令的主要功能包括:
-
提取字节:使用
-b
选项,可以按字节位置提取文本。例如,-b 1-3
表示提取每行的第1到第3个字节。 -
提取字符:使用
-c
选项,可以按字符位置提取文本。这在处理多字节字符环境时特别有用,因为它以字符为单位进行计数,而不是字节。 -
指定分隔符:使用
-d
选项,可以指定字段分隔符。默认情况下,字段由制表符分隔,但可以通过此选项使用逗号或其他字符作为分隔符。 -
提取字段:使用
-f
选项,可以按字段提取。字段是由分隔符(默认为制表符)分隔的文本单元。例如,-f 1,3
表示提取每行的第1和第3个字段。
示例:
[root@localhost Desktop]# echo ${PATH} /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin # 显示第2个字符 [root@localhost Desktop]# echo ${PATH} | cut -b 2 # 显示第2个字符之后的所有字符 [root@localhost Desktop]# echo ${PATH} | cut -c 2- # 显示第2个到第6个字符 [root@localhost Desktop]# echo ${PATH} | cut -c 2-6
# 显示第二个和第四个/后面的字符并且以/为分隔符 echo ${PATH} | cut -d '/' -f 3,5
# 打印/etc/passwd文件中以:为分隔符的第1个字段和第6个字段分别表示用户名和其家目录 cut /etc/passwd -d ':' -f 1,6
grep
分析所需信息,取得所需信息的所在行
格式:
grep [options] pattern [files] 或 grep [-abcEFGhHilLnqrsvVwxy][-A<显示行数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]
-
pattern - 表示要查找的字符串或正则表达式。
-
files - 表示要查找的文件名,可以同时查找多个文件,如果省略 files 参数,则默认从标准输入中读取数据。
常用的选项:
-i
:忽略大小写进行匹配。
-v
:反向查找,只打印不匹配的行。
-n
:显示匹配行的行号。
-r
:递归查找子目录中的文件。
-l
:只打印匹配的文件名。
-c
:只打印匹配的行数
其他选项:
-
-a 或 --text : 不要忽略二进制的数据。
-
-A<显示行数> 或 --after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
-
-b 或 --byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。
-
-B<显示行数> 或 --before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
-
-c 或 --count : 计算符合样式的列数。
-
-C<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
-
-d <动作> 或 --directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
-
-e<范本样式> 或 --regexp=<范本样式> : 指定字符串做为查找文件内容的样式。
-
-E 或 --extended-regexp : 将样式为延伸的正则表达式来使用。
-
-f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
-
-F 或 --fixed-regexp : 将样式视为固定字符串的列表。
-
-G 或 --basic-regexp : 将样式视为普通的表示法来使用。
-
-h 或 --no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。
-
-H 或 --with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称。
-
-i 或 --ignore-case : 忽略字符大小写的差别。
-
-l 或 --file-with-matches : 列出文件内容符合指定的样式的文件名称。
-
-L 或 --files-without-match : 列出文件内容不符合指定的样式的文件名称。
-
-n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
-
-o 或 --only-matching : 只显示匹配PATTERN 部分。
-
-q 或 --quiet或--silent : 不显示任何信息。
-
-r 或 --recursive : 此参数的效果和指定"-d recurse"参数相同。
-
-s 或 --no-messages : 不显示错误信息。
-
-v 或 --invert-match : 显示不包含匹配文本的所有行。
-
-V 或 --version : 显示版本信息。
-
-w 或 --word-regexp : 只显示全字符合的列。
-
-x --line-regexp : 只显示全列符合的列。
-
-y : 此参数的效果和指定"-i"参数相同。
示例:
1.3.2 排序命令sort、wc、uniq
sort
在Shell中,可以使用sort
命令对数据进行排序。
格式:
sort [-parameter] [file or stdin]
参数:
参数 | 说明 |
---|---|
-b | 忽略每行前面开始出的空格字符 |
-c | 检查文件是否已经按照顺序排序 |
-d | 排序时,处理英文字母、数字及空格字符外,忽略其他的字符 |
-f | 排序时,将小写字母视为大写字母 |
-i | 排序时,除了040至176之间的ASCII字符外,忽略其他的字符 |
-m | 将几个排序号的文件进行合并 |
-M | 将前面3个字母依照月份的缩写进行排序 |
-n | 依照数值的大小排序 |
-o <输出文件> | 将排序后的结果存入制定的文件 |
-r | 以相反的顺序来排序 |
-t <分隔字符> | 指定排序时所用的栏位分隔字 |
-k | 指定需要排序的栏位 |
示例:
创建data.txt
的文件,内容如下:
自动排序
sort data.txt # 或者 cat data.txt | sort
如果字段是由特殊字符(如冒号)分隔的,可以使用-t
选项指定分隔符,-n按数字排列:
cat data.txt | sort -t ':' -k 2 -n
倒叙排列
cat data.txt | sort -t ':' -k 2 -n -r
cat data.txt | cut -d ':' -f 2,3 | sort -t ':' -k 1 -n
wc
统计指定文件中的字节数、字数、行数,并将统计结果显示输出
格式:
wc [-parameter]
参数:
参数 | 说明 |
---|---|
-w | 统计字数,或--words:只显示字数。一个字被定义为由空白、跳格或换行字符分隔的字符串 |
-c | 统计字节数,或--bytes或--chars:只显示Bytes数 |
-l | 统计行数,或--lines:只显示列数 |
-m | 统计字符数 |
-L | 打印最长行的长度 |
--help | 显示帮助信息 |
--version | 显示版本信息 |
示例:
1.3.3 双向重定向:tee
tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件
格式:
tee [-parameter] file
参数:
参数 | 说明 |
---|---|
-a | 附加到既有文件的后面,而非覆盖它 |
-i | 忽略中断信号 |
— help | 查看帮助信息 |
— version | 显示版本信息 |
示例:
1.3.4 字符转换命令 tr, col, join, paste, expand
tr
一种可将字符进行替换、压缩、删除,可以将一组字符转换成另一组字符
格式:
tr [-parameter] [string1] [string2]
参数:
参数 | 说明 |
---|---|
-s | 将多个连续的字符压缩为一个字符 |
-d | 删除指定的字符 |
-t | 对指定的字符进行替换 |
-c | 将指定字符外的字符替换为指定字符 |
示例:
将多个连续的t压缩为T
ll|tr -s t T
-d : 删除字符串:
cat /etc/passwd | tr -d ':'
-t:将r替换为R
ll|tr -t r R
所有的小写变成大写字符
# 所有的小写变成大写字符 ll | tr [a-z] [A-Z]
col
该命令是一个标准输入文本过滤器,它从标注输入设备读取文本内容,并把内容显示到标注输出设备
格式:
col [-parameter]
参数:
https://blog.csdn.net/u012964600/article/details/135201348
示例:
join
将两个具有相同域的纪录给挑选出来,再将这些纪录所有的域放到一行(要整合的内容中如有相同的内容,则整合后不会重复显示)
格式:
join [-parameter] file1 file2
参数:
参数 | 说明 |
---|---|
-a1或-a2 | 除了显示共同域的纪录之外,-a1显示第一个文件没有共同域的纪录,-a2显示第二个文件中没有共同域的纪录 |
-i | 忽略大小写 |
-o | 设置结果显示的格式 |
-t | 改变域的分隔符 |
-v1或-v2 | 不显示共同域的纪录之外,-v1显示第一个文件没有共同域的纪录,-v2显示第二个文件中没有共同域的纪录 |
-1或-2 | -1用来设置文件1连接的域,-2用来设置文件2连接的域 |
示例:
join -t ':' data.txt data2.txt | head -n 3 join -t ':' -1 4 data.txt -2 3 data2.txt | head -n 3
paste
把每个文件以列对列的方式,一列列地加以合并 ,他就是相当于把两个不同的文件内容粘贴在一起,形成新的文件
格式:
paste [-parameter] file1 file2
参数:
参数 | 说明 |
---|---|
-d | 默认域的分隔符是空格或tab键,设置新的域分隔符 |
-s | 将每个文件粘贴成一行 |
-- | 从标准输入中读取数据 |
示例:
paste data.txt data2.txt
expand
转换为空白字符
格式:
expand [-parameter]
参数:
参数 | 说明 |
---|---|
-t | 指定制表符所代表的空白字符的个数,而不使用默认的8。 |
-i | 不转换非空白符后的制表符 |
--help | 显示帮助信息 |
--version | 显示版本信息 |
示例:
1.3.5 切割命令split
split
将大文件分割成较小的文件,在默认情况下将按照每1000行切割成一个小文件
格式:
split [-parameter] 切割文件 filename
参数:
参数 | 说明 |
---|---|
-b | 指定每多少字节切成一个小文件 |
--help | 查看帮助信息 |
--version | 显示版本信息 |
-C | 与参数”-b”相似,但是在切割时将尽量维持每行的完整性 |
二、数据流重定向
-
标准输入in:代码0,使用 < 或者 <<
-
标准输出out:代码1,使用 > 或者 >>
-
错误输出:代码2,使用 > 或者 >>
-
> 表示 写入; >>表示追加
-
<表示 读入;<<表示结束读入
-
2>&1
:2>&1
表示将标准错误输出(stderr)重定向到标准输出(stdout)。command 2>&1
,表示将command
命令的标准错误输出和标准输出合并,并一起显示。
示例
读取data.txt的内容,追加到data2.txt中
cat data.txt >> data2.txt
cat >> 2.txt << EOF
示例:
创建目录脚本(1.sh):
#!/bin/bash # 标准输出 echo '标准输出内容' # 错误输出 cho '错误'
标准输出(stdout)输出到到日志文件中
./1.sh >1.log ./1.sh 1>1.log
标准错误输出(stderr)输出到日志文件中
./1.sh 2>1.log
标准输出(stdout)和标准错误输出(stderr)同时输出到到日志文件中
./1.sh >1.log 2>&1
2>&1
:表示将标准错误输出(stderr)重定向到标准输出(stdout),这样,即使删除目录失败,也不会影响创建目录的结果,错误信息也会被记录到output.txt文件中。
三、脚本调试
Shell编程中,调试是一个重要的环节,它帮助我们查找脚本中的问题并进行修复。同时,合理的错误处理也是编写健壮的Shell脚本的关键 。
3.1 调试工具和技巧
3.1.1 echo命令
在Shell脚本中,我们可以使用echo
命令输出一些中间结果,以便在运行脚本时查看变量的取值和程序流程。例如:
#!/bin/bash name="John" echo "The name is: $name"
3.1.2 set -x
使用set -x
命令可以在脚本执行过程中显示每个命令及其参数,非常有助于查看脚本的执行流程。
#!/bin/bash set -x name="John" age=30 echo "Name: $name" echo "Age: $age"
3.1.3 set -e
使用set -e
命令可以在脚本执行过程中,一旦出现非零返回值的命令,立即退出脚本。这对于快速发现错误非常有帮助。
# 程序出错,立刻中断执行 # set -e add(){ # 函数出错,继续向下执行,函数的调用结果看最后一行命令的执行结果 cho 'add方法' echo '结束' } add # echo '结束'是函数的执行结果 echo 'add方法的调用结果:'$?
3.1.4 调试器:bash -x
如果脚本比较复杂,使用上述方法可能不够方便。我们可以通过在终端中运行脚本,并加上-x
选项来调试整个脚本
bash -x 1.sh
3.2 错误处理
在Shell脚本中,错误处理是确保脚本在运行过程中能够适当地处理各种异常情况的关键。
3.2.1. 检查命令返回值
在脚本中执行命令后,可以通过$?
变量来获取命令的返回值。通常,返回值为0表示命令成功执行,非零值表示命令执行失败。
#!/bin/bash ls /path/to/non_existent_dir if [ $? -ne 0 ]; then echo "Error: Directory not found." fi
3.2.2 使用exit命令退出脚本
在脚本中,如果发现错误或者异常情况,可以使用exit
命令终止脚本的执行,并返回一个非零值表示错误。
#!/bin/bash file="/path/to/non_existent_file" if [ ! -f "$file" ]; then echo "Error: File not found." exit 1 fi
3.2.3 使用trap命令捕获信号
使用trap
命令可以捕获脚本接收到的信号,并执行相应的操作。这样可以在脚本执行过程中优雅地处理中断。
以下是 trap
命令的十种主要用法及其代码示例:
*用法* | *示例代码* |
---|---|
捕获并处理指定信号 | trap 'echo "Signal received."' INT |
忽略指定信号 | trap '' TERM |
恢复默认的信号处理方式 | trap - INT |
设置 EXIT 信号处理函数 | trap 'cleanup' EXIT |
在函数内部设置 RETURN 信号处理函数 | func() { trap 'cleanup' RETURN; ... } |
清除所有已设置的信号处理函数 | trap - INT TERM EXIT |
执行命令并在结束时恢复先前的信号处理方式 | trap 'cmd' EXIT; cmd |
在循环中使用 trap 避免在接收到信号时终止循环 | while true; do trap 'break' INT; ... ; done |
使用函数作为信号处理函数 | trap 'cleanup' INT; cleanup() { echo "Cleaning up..."; } |
处理多个信号 | trap 'echo "Signal 1 received."' SIGUSR1; trap 'echo "Signal 2 received."' SIGUSR2 |
1 清理资源
#!/bin/bash cleanup() { echo "Cleaning up..." # 执行清理操作,例如关闭文件描述符、删除临时文件等 } # 设置 EXIT 信号处理函数 trap cleanup EXIT # 其他代码逻辑
2 记录错误日志
#!/bin/bash log_file="error.log" # 定义错误处理函数,将错误信息记录到日志文件 handle_error() { echo "$(date): $BASH_COMMAND failed with exit code $?" >> "$log_file" exit 1 } # 设置 ERR 信号处理函数 trap handle_error ERR # 其他代码逻辑 cat no_such_file.txt
3 忽略特定信号
#!/bin/bash trap 'echo "Caught SIGINT"; exit' INT echo "Script is running. Try pressing Ctrl+C." while true; do sleep 1 done
4 优雅处理脚本终止
#!/bin/bash cleanup() { echo "Performing cleanup..." # 清理操作 } # 设置 EXIT 信号处理函数 trap cleanup EXIT # 主要代码逻辑 echo "Running script..." # 模拟脚本执行过程中的异常终止 if [[ "$1" == "error" ]]; then echo "Error occurred." exit 1 fi echo "Script completed successfully."
CentOS 7(以及大多数类Unix/Linux系统)中,信号是进程间通信的一种方式,用于通知进程某个事件的发生。这些信号具有预定义的编号和名称,并且大多数系统信号在POSIX标准中都有定义。以下是一些CentOS 7中常用的信号列表,这些信号可以通过kill命令或其他方式发送给进程:信号编号信号名称描述 SIGHUP 终端挂起或用户退出。常用于通知进程重新读取配置文件并重启。 SIGINT 中断信号,通常由Ctrl+C产生,要求进程立即停止。 SIGQUIT 退出信号,生成core dump后退出。 SIGABRT 由abort()函数产生,导致程序异常终止。 SIGKILL 强制杀死进程,该信号不能被捕获、阻塞或忽略。 SIGALRM 定时器超时。 SIGTERM 请求程序终止。这是kill命令的默认信号,可以被捕获、阻塞或忽略。 SIGCONT 如果进程已停止(例如,收到SIGSTOP信号),则继续执行。 SIGSTOP 停止进程的执行,不能被捕获、阻塞或忽略。 SIGTSTP 终端停止信号,通常由Ctrl+Z产生。 注意:这个列表并不包含所有可用的信号,只是列出了一些常用的信号。信号编号和名称在大多数Unix和类Unix系统中都是相同的,因为它们遵循POSIX标准。你可以使用kill -l命令在CentOS 7中查看所有可用的信号及其编号和名称。此外,还有一些实时信号(实时信号编号通常从34开始),但这些信号在日常使用中相对较少见,主要用于需要高精度控制的场景。对于大多数用户和应用程序来说,上述列出的信号已经足够使用。