内容格式化以及多样化输出
1. 前倾回顾
本章节我们一起来学习下,shell中内容格式化,以及多样输出。但是在学习之前,我们先来看看上个章节【shell 变量的定义以及使用】 我们都学习到了什么知识
shell 变量的定义以及使用
- 变量分类
- 变量定义
- 类型变量定义
- 移除变量
- 单引号以及双引号区分
- 命令变量
- 全局变量
- 变量作用范围
- 内置变量
2. 内容格式化
2.1 重定向
我们可以通过重定向的形式将命令中的内容输出到文件中,但是输出的格式大致分为2种
- 覆盖性
- 追加性
覆盖方式
以符号
>
表示将内容直接覆盖
[root@localhost day04]# ll | grep test002
[root@localhost day04]# echo 1111 > test002.md
[root@localhost day04]# cat test002.md
1111
[root@localhost day04]# echo 222 > test002.md
[root@localhost day04]# cat test002.md
222
[root@localhost day04]#
追加方式
以符号
>>
表示将内容直接追加
[root@localhost day04]# cat test002.md
222
[root@localhost day04]# echo 333 >> test002.md
[root@localhost day04]# cat test002.md
222
333
[root@localhost day04]#
2.2 管道符
使用符号|
表示管道符,将左侧命令的结果,传递给右侧的命令来使用
例如
[root@localhost day04]# env | grep -wi home
HOME=/root
2.3 后台执行
什么叫后台执行呢? 比如命令sleep 3
. 此命令一直会阻塞其余命令执行。所以我们想让其在后台执行,那应该怎么做呢。
命令尾部 添加符号&
表示此命令后台执行
例如
[root@localhost day04]# sleep 4 &
[1] 2484
[root@localhost day04]#
2.4 信息符号
什么叫信息符号呢?? 表示正确的信息,错误的信息 以及所有的消息
- 正确的信息
1>>
- 错误的信息
2>>
- 错误以及正确的信息
2>&1
案例1
[root@localhost day04]# cat test002.md 1>> normalFile
[root@localhost day04]# cat normalFile
222
333
[root@localhost day04]# sdfdsf 2>> errFile
[root@localhost day04]# cat errFile
-bash: sdfdsf: command not found
[root@localhost day04]#
案例2
/bin/bash ./ceshi.sh 1>> ceshi_info 2>> ceshi_err
[root@localhost day04]# cat ceshi.sh
#!/bin/bash
echo "下一条是错误的命令"
sdfsdfds
[root@localhost day04]# /bin/bash ./ceshi.sh 1>> ceshi_info 2>> ceshi_err
[root@localhost day04]# cat ceshi_info
下一条是错误的命令
[root@localhost day04]# cat ceshi_err
./ceshi.sh: line 5: sdfsdfds: command not found
[root@localhost day04]#
案例3
[root@localhost ~]# /bin/bash ceshi.sh >> ceshi-all 2>&1
[root@localhost ~]# cat ceshi-all
下一条错误命令
ceshi.sh:行5: dsfsafsafdsa: 未找到命令
3. 输入格式化
什么叫输入的格式化呢,其实就是可以多行输入,输入啥就是就是啥。 可以像在文本种一样在命令行种输入
3.1 EOF原理
eof
[root@localhost day04]# cat << eof
> sfsdf sf s
> s fdds s
> sdfsdfs
> eof
sfsdf sf s
s fdds s
sdfsdfs
[root@localhost day04]#
3.2 cat 实践
实现多行文本的输出
cat > normalfile << eof
将eof中内容赋值给cat, cat将内容以覆盖的形式保存到文件normalfile中
[root@localhost day04]# cat > normalfile << eof
> 这是一个请假条
> 一个很好的请教条
> 这个请假条就是为了请假的
> eof
[root@localhost day04]# cat normalfile
这是一个请假条
一个很好的请教条
这个请假条就是为了请假的
3.3 tee 实践
tee命令读取标准输入,把这些内容同时输出到标准输出和(多个)文件中,tee命令可以重定向标准输出到多个文件。要注意的是:在使用管道线时,前一个命令的标准错误输出不会被tee读取。
命令格式
样式1:只输出到标准输出
tee
样式2:输出到标准输出的同时,保存到文件file中
tee file
样式3:输出到标准输出的同时,追加到文件file中。如果文件不存在则创建;如果文件存在则追加。
tee -a file
tee host2 <<- EOF ... EOF
样式4: 输出到标准输出两次。
tee -
样式5:输出到标准输出两次,同时保存到file1和file2中。
tee file1 file2 -
案例
输出到命令行的同时 && 输出到文件中
[root@localhost day04]# echo test-tee | tee
test-tee
[root@localhost day04]# echo test-tee | tee test003.md
test-tee
[root@localhost day04]# cat test003.md
test-tee
[root@localhost day04]#
相同的内容 多次输出
[root@localhost day04]# echo test-tee | tee
test-tee
[root@localhost day04]# echo test-tee | tee -
test-tee
test-tee
[root@localhost day04]# echo test-tee | tee - -
test-tee
test-tee
test-tee
[root@localhost day04]#
4. 格式化输出
4.1 echo 解读
格式
OPTIONS:
-n 不要在最后自动换行
-e 若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:
转义字符
\a 发出警告声;
\b 删除前一个字符;
\c 最后不加上换行符号;
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
\ 插入\字符;
\0nnn 打印nnn(八进制)所代表的ASCII字符; 备注:数字0 不要理解成字母o
\xNN 打印NN(十六进制)所代表的ASCII字符;
不换行输出
[root@localhost day04]# echo -n 11; echo 22
1122
[root@localhost day04]#
转义
[root@localhost day04]# echo -e "aa\nbb"
aa
bb
[root@localhost day04]# echo "aa\nbb"
aa\nbb
[root@localhost day04]#
4.2 颜色输出
格式
格式如下:
echo -e "\033[字背景颜色;文字颜色m字符串\033[0m"
echo -e "\033[41;36m 显示的内容 \033[0m"
4.3 颜色分类
色彩 | 黑 | 红 | 绿 | 黄 | 蓝 | 紫 | 青 | 灰 |
---|---|---|---|---|---|---|---|---|
字体色 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 |
背景色 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 |
4.4 printf格式化
虽然我们能够通过 echo的方式实现信息某种程度的格式化输出,但是很多信息的输出偏重于手工的干预,效率太慢。我们需要一种功能更强大、效率更高的格式化手段。
– printf
语法格式
查看帮助
[root@localhost ~]# help printf
printf: printf [-v var] 格式 [参数]
```bash
格式化替换符
%s 字符串
%d,%i 十进制整数
%f 浮点格式
%c ASCII字符,即显示对应参数的第一个字符
%b 相对应的参数中包含转义字符时,可以使用此替换符进行替换,对应的转义字符会被转义
%o 八进制值
%u 不带正负号的十进制值
%x 十六进制值(a-f)
%X 十六进制值(A-F)
%% 表示%本身
虽然上述参数很多 但是其实我们自己用到的并不多。%s
, %d, %i
, %f
, $$
格式化字符解释
– 将字段里已格式化的值向左对齐
空格 在正值前置一个空格,在负值前置一个负号
+ 总是在数值之前放置一个正号或负号,即便是正值也是
# 下列形式选择其一:
%o有一个前置的o; %x与%X分别前置的0x与0X;
%e,%E与%f总是在结果中有一个小数点; %g与%G为没有结尾的零。
0 以零填补输出,而非空白.这仅发生在字段宽度大于转换后的情况
案例1:添加换行
[root@localhost day04]# echo "test1"
test1
[root@localhost day04]# printf "test1"
test1[root@localhost day04]#
[root@localhost day04]# printf "test1\n"
test1
[root@localhost day04]#
案例2:替换符号
[root@localhost day04]# printf "姓名:%s, 年龄:%d, 身高:%f\n" lihh 20 180.1
姓名:lihh, 年龄:20, 身高:180.100000
[root@localhost day04]#
上述符号%s, %d, %f
都素hi待替换的占位符。
案例3:显示%f 小数点个数
[root@localhost day04]# printf "姓名:%s, 年龄:%d, 身高:%.1f\n" lihh 20 180.1
姓名:lihh, 年龄:20, 身高:180.1
[root@localhost day04]#
案例4:显示指定宽度 并左对齐
[root@localhost day04]# printf "姓名:%-10s, 年龄:%-10d, 身高:%-10.1f\n" lihh 20 180.1
姓名:lihh , 年龄:20 , 身高:180.1
[root@localhost day04]#