Shell 格式化输出printf、awk
Shell 文件的格式化与相关处理 printf、awk
格式化打印printf
使用场景:将数据格式化输出
语法:printf '打印格式' 实际内容
选项与参数
关于格式方面的几个特殊样式
\n 换行符
\t 水平[tab]按键
\b 后退
%-ns -左对齐,没有则右对齐,输出宽度为n的字符,任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过会将内容全部显示出来。
%nd 整型输出
%ni i代表integer,多少位整数
%c 输出一个字符
%N.nf N代表共输出 N 位数,其中n位小数的
说明
1.printf不是管道命令
2.打印格式外面是单双引号都可以
3.格式只指定了一个参数,但多出来的参数仍然会按照该格式输出,格式化字符串会被重用
shell [ranan@hadoop102 ~]$ printf "%s\n" python shell python shell
4.如果没有参数,会用默认值代替,那么%s用null代替,%d用0代替
案例.格式化输出文件内容
[ranan@hadoop102 ~]$ printf "%10s\t %5s\t %5\t \n" $(cat pringtf.txt)
输出命令echo
Shell中的输出命令有两个printf与echo
区别 | echo | printf |
---|---|---|
自动添加换行符 | √ | × |
设置输出格式 | × | √ |
语法:echo [选项] 输出的内容
选项
-n 不要在最后自动换行
-e 进行反斜杠转义,字符串里面出现转义字符将进行转义
案例
输出命令执行结果
echo `date` #注意是反斜杠
输出内容到文件,文件若不存在则会创建一个文件
> 覆盖写
>> 追加写
echo 123 >> text.txt
echo 输出文件内容
'<'是重定向符,用于改变标准输入的源(从键盘改为文件fileName);<fileName将fileName文件输入到stdin中。
需要输出可以使用cat命令
[ranan@hadoop102 bin]$ echo $(< myhadoop.sh)
awk数据处理工具
sed:一整行的处理
awk:一行分成数个字段来处理,适合小型文本数据
awk 语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息,awk 抽取信息后,才能进行其他文本操作,完整的 awk 脚本通常用来格式化文本文件中的信息
语法格式
awk [-F] '条件类型1{操作1} 条件类型2{操作2}..' filename
-F分隔符 指定分隔符
awk可以处理后续接的文件,也可以读取来自前一个命令的标准输出。
注意:这里的引号只能是单引号,awk中变量可以直接使用
处理流程
1.读入第一行,并将第一行的数据写入$0,$1,$2等变量当中
2.根据条件,判断是否需要进行后续的操作
3.完成所有操作和判断
4.重复1~3直到所有数据处理完。
awk是以行为一次处理的单位,字段为最小的处理单位
AWK内置变量
$n:当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段
$0:表示执行过程中当前行的文本内容
FILENAME : 当前输入文件的名。
NR : 目前awk所处理的第几行数据
NF(Field): 每一行($0)拥有的字段总数
$NF:最后一个Field(列)的数据
FS:目前的列的分隔符,默认是空格
[ranan@hadoop102 ~]$ last -n 5
ranan pts/0 192.168.10.1 Thu Dec 2 15:56 still logged in
ranan pts/0 192.168.10.1 Tue Nov 30 19:37 - 10:51 (15:13)
ranan pts/1 192.168.10.1 Tue Nov 30 15:16 - 19:35 (04:18)
ranan pts/0 192.168.10.1 Tue Nov 30 10:54 - 16:48 (05:53)
reboot system boot 4.18.0-240.22.1. Tue Nov 30 10:37 still running
wtmp begins Sun May 23 20:25:21 2021
[ranan@hadoop102 ~]$ last -n 5 | awk '{print $1 "\t" NF "\t最后一列的数据:" $NF}'
ranan 10 最后一列的数据:in
ranan 10 最后一列的数据:(15:13)
ranan 10 最后一列的数据:(04:18)
ranan 10 最后一列的数据:(05:53)
reboot 10 最后一列的数据:running
0 最后一列的数据:
wtmp 7 最后一列的数据:2021
print 结尾自动加\n
printf 结尾不加\n
条件
这里我尝试改变FS,以:为分隔符,输出第一个和第二个元素(逗号分隔开),结果这里不太行
[ranan@hadoop102 ~]$ echo $PATH | awk '{print $0}'
/home/ranan/.local/bin:/home/ranan/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/module/jdk1.8.0_212/bin:/opt/module/hadoop-3.1.3/bin:/sbin
[ranan@hadoop102 ~]$ echo $PATH | awk '{FS=":"}{print $1,$2}'
/home/ranan/.local/bin:/home/ranan/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/module/jdk1.8.0_212/bin:/opt/module/hadoop-3.1.3/bin:/sbin
原因是awk执行的流程是
1.读入第一行,并将第一行的数据写入$0,$1,$2等变量当中
2.根据条件,判断是否需要进行后续的操作
3.完成所有操作和判断
意思是改变分隔符之前,第一行使用默认分隔符进行分割了,那么从第二行开始才是以:
分割的。
这里可以通过添加条件类型解决,一般使用关系表达式作为条件。
条件类型 | 条 件 | 说 明 |
---|---|---|
awk保留字 | BEGIN | 在 awk 程序一开始,尚未读取任何数据之前执行。BEGIN 后的动作只在程序开始时执行一次 |
awk保留字 | END | 在 awk 程序处理完所有数据,即将结束时执行。END 后的动作只在程序结束时执行一次 |
关系运算符 | > | 大于 |
关系运算符 | < | 小于 |
关系运算符 | >= | 大于等于 |
关系运算符 | <= | 小于等于 |
关系运算符 | == | 等于 |
关系运算符 | != | 不等于 |
关系运算符 | A~B | 判断字符串 A 中是否包含能匹配 B 表达式的子字符串 |
关系运算符 | A!~B | 判断字符串 A 中是否不包含能匹配 B 表达式的子字符串 |
正则表达式 | /正则/ | 如果在“//”中可以写入字符,则也可以支持正则表达式 |
所以我们需要在读入第一行之前,就处理分隔符
[ranan@hadoop102 ~]$ echo $PATH | awk 'BEGIN {FS=":"}{print $1,$2}'
/home/ranan/.local/bin /home/ranan/bin
高级操作
next 跳过当前行
awk中next语句使用:在循环逐行匹配,如果遇到next,就会跳过当前行,直接忽略下面语句。而进行下一行匹配。
awk 'NR%2==1{next}{print NR,$0;}' text.txt
if条件判断式
语法
if(表达式)
动作1
else
动作2
或者if(表达式)动作1;else动作2
[ranan@c105 ~]$ echo x | awk '{if(x>3)print "x大于3";else print"x不大于3" }'
x不大于3
循环
while语法
while (条件)
动作
for循环语法
for (变量;条件;计数器)
动作
动作一句不用加分号
动作多句用分号隔开
continue和break
break 跳出循环
continue 终止当前循环
Shell 格式化输出printf、awk的更多相关文章
- shell编程系列15--文本处理三剑客之awk格式化输出printf
shell编程系列15--文本处理三剑客之awk格式化输出printf printf的格式说明符 格式符 含义 %s 打印字符串 %d 打印十进制数 %f 打印一个浮点数 %x 打印十六进制数 %o ...
- 7.20.01 java格式化输出 printf 例子
java格式化输出 printf 例子 importjava.util.Date; publicclassPrintf { publicstaticvoidmain(String[] args) { ...
- Java面向对象 第2节 Scanner 类和格式化输出printf
§Scanner 类 java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入. 1.创建 Scanner 对象的基本语法:Scanner s = ...
- 【转】java格式化输出 printf 例子
[转]java格式化输出 printf 例子 转自http://www.cnblogs.com/TankMa/archive/2011/08/20/2146913.html#undefined imp ...
- java 格式化输出 printf 总结
double d = 345.678; String s = "hello!"; ; //"%"表示进行格式化输出,"%"之后的内容为格式的 ...
- java格式化输出 printf 例子
import java.util.Date; public class Printf { public static void main(String[] args) { // %s表示输出字符串,也 ...
- 了解Java格式化输出printf,一篇就够了
格式化详解 格式化输出 转换符 常用转换符 日期转换 搭配标志 了解C语言的都知道,C语言的输出语句printf();可以对里面的内容格式化然后输出.那么在Java中也给我们提供了相关的方法.两者十分 ...
- shell 除法和格式化输出printf
相关知识的补充: printf命令模仿C程序库里的printf()程序.printf由POSIX标准所定义,因此使用printf的脚本比使用echo有着更好的移植性. printf使用引用文本或者空格 ...
- Shell 格式化输出数字、字符串(printf)
1.语法 printf打印格式字符串,解释'%'指令和'\'转义. 1.1.转义 printf使用时需要指定输出格式,输出后不换行. printf FORMAT [ARGUMENT] printf O ...
随机推荐
- 期望 概率DP
期望 \(x\) 的期望 \(E(x)\) 表示平均情况下 \(x\) 的值. 令 \(C\) 表示常数, \(X\) 和 \(Y\) 表示两个随机变量. \(E(C)=C\) \(E(C \time ...
- java性能优化常用工具jmap、jstack
jmap:java内存映像工具 jmap用于生成堆转储快照,比较常用的option包括-heap,-histo,-dump [root@localhost script]# jmap -h Usage ...
- 几个简单的文本处理工具:diff,patch,grep,cut,sort,tr
1:文本处理工具: 1:diff and patch : diff是比较文件或者目录的不同,主要有3个用法: diff file1 file2 :比较file1和file2的不同:diff -u ...
- Qt5 C++ GUI界面 开发环境配置 详细教程
本博客已暂停更新,需要请转新博客http://www.whbwiki.com/333.html Qt 下载 Qt 体积很大,有 1GB~3GB,官方下载通道非常慢,相信很多读者会崩溃,所以建议大家使用 ...
- loadruuner12基准测试流程
基准测试:单用户测试 一.归纳基准测试: 方法一:单用户循环5次 1.调试好脚本(加检查点,在VuGen中运行成功) 2.打开控制台,设置Run-time Settings 3.迭代次数:5 4.Pa ...
- 【AI测试】人工智能 (AI) 测试--开篇
人工智能测试 什么是人工智能,人工智能是怎么测试的.可能是大家一开始最想了解的.大家看图中关于人工智能的定义.通俗点来说呢,就是 让机器实现原来只有人类才能完成的任务:比如看懂照片,听懂说话,思考等等 ...
- FastApi下载文件
FastApi下载文件 记得之前我们讲过生成excel文件的事情,那么如何把服务器生成的excel文件正确发送给用户呢? 今天我们就来说说在FastApi中如何正确让用户下载到想要的文件. 基本流程 ...
- 巧用Python快速构建网页服务器
经常做web开发,要调试一个网页,直接打开文件,用file模式显然是业余的. 但动辄要部署个IIS或APACHE站点,也确实太累,怎么办? 逐浪君此前有分享过通过http-server来构建快速的we ...
- 菜鸡的Java笔记 - java 常用类库
CommonClassLibrary 常用类库 定时调度 定时调度指的是每到一个时刻,都会自动的产生某些特定的操作形式 con ...
- etcd install & configuration
目录 概述 先决条件 相关术语 ETCD 部署 源码安装 其他方式 安装报错 配置文件详解 etcdctl 使用 日志独立 概述 etcd 是兼具一致性和高可用性的键值数据库,为云原生架构中重要的基础 ...