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的更多相关文章

  1. shell编程系列15--文本处理三剑客之awk格式化输出printf

    shell编程系列15--文本处理三剑客之awk格式化输出printf printf的格式说明符 格式符 含义 %s 打印字符串 %d 打印十进制数 %f 打印一个浮点数 %x 打印十六进制数 %o ...

  2. 7.20.01 java格式化输出 printf 例子

    java格式化输出 printf 例子 importjava.util.Date; publicclassPrintf { publicstaticvoidmain(String[] args) { ...

  3. Java面向对象 第2节 Scanner 类和格式化输出printf

    §Scanner 类 java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入. 1.创建 Scanner 对象的基本语法:Scanner s = ...

  4. 【转】java格式化输出 printf 例子

    [转]java格式化输出 printf 例子 转自http://www.cnblogs.com/TankMa/archive/2011/08/20/2146913.html#undefined imp ...

  5. java 格式化输出 printf 总结

    double d = 345.678; String s = "hello!"; ; //"%"表示进行格式化输出,"%"之后的内容为格式的 ...

  6. java格式化输出 printf 例子

    import java.util.Date; public class Printf { public static void main(String[] args) { // %s表示输出字符串,也 ...

  7. 了解Java格式化输出printf,一篇就够了

    格式化详解 格式化输出 转换符 常用转换符 日期转换 搭配标志 了解C语言的都知道,C语言的输出语句printf();可以对里面的内容格式化然后输出.那么在Java中也给我们提供了相关的方法.两者十分 ...

  8. shell 除法和格式化输出printf

    相关知识的补充: printf命令模仿C程序库里的printf()程序.printf由POSIX标准所定义,因此使用printf的脚本比使用echo有着更好的移植性. printf使用引用文本或者空格 ...

  9. Shell 格式化输出数字、字符串(printf)

    1.语法 printf打印格式字符串,解释'%'指令和'\'转义. 1.1.转义 printf使用时需要指定输出格式,输出后不换行. printf FORMAT [ARGUMENT] printf O ...

随机推荐

  1. 洛谷 P2680 [NOIP2015 提高组] 运输计划

    链接:P2680 题意: 在树上把一条边边权变为0使得最长给定路径最短 分析: 最大值最小可以想到二分答案,对于每一个mid,寻找所有大于mid的路径,再寻找是否存在一条边使得删去它后大于mid的路径 ...

  2. jQuery根据地址获取经纬度

    一.HTML部分 1 @*景区位置*@ 2 <tr> 3 <th>景区名称:</th> 4 <td><input class="txt ...

  3. 第03课 OpenGL 添加颜色

    添加颜色: 作为第二课的扩展,我将叫你如何使用颜色.你将理解两种着色模式,在下图中,三角形用的是光滑着色,四边形用的是平面着色 上一课中我教给您三角形和四边形的绘制方法.这一课我将教您给三角形和四边形 ...

  4. cm0 逆向分析

    目录 cm0 逆向分析 前言 Strings工具复习 String工具使用说明 Strings工具解cm0题 cm0 逆向分析 前言 Emmmmm,我假装你看到这里已经学过了我的<恶意代码分析实 ...

  5. C语言的“隐式函数声明”违背了 “前置声明” 原则

    这个问题来源于小组交流群里的一个问题: 最终问题落脚在 : 一个函数在main中调用了,必须在main之前定义或者声明吗? 我在自己的Centos上做了实验,结果是函数不需要,但是结构体(变量也要)需 ...

  6. NCF 中如何将Function升级到FunctionRender

    简介 历史的车轮在不断的向前推进,NCF也在不断的迭代更新,只为成为更好的NCF 如果你之前没有用过NCF可以跳过这个文档,直接去下载最新的NCF源码进行实践. NCF仓库地址:https://git ...

  7. Linux usb 4. Device 详解

    文章目录 1. 简介 2. Platform Layer 2.1 Platform Device 2.2 Platform Driver 3. UDC/Gadget Layer 3.1 Gadget ...

  8. Part 35 AngularJS caseInsensitiveMatch and Inline Templates

    In this video we will discuss 2 simple but useful features in Angular caseInsensitiveMatch Inline Te ...

  9. 1组-Alpha冲刺-4/6

    一.基本情况 队名:震震带着六菜鸟 组长博客:https://www.cnblogs.com/Klein-Wang/p/15553196.html 小组人数:7人 二.冲刺概况汇报 王业震 过去两天完 ...

  10. 菜鸡的Java笔记 - java 线程的同步与死锁 (同步 synchronization,死锁 deadlock)

    线程的同步与死锁 (同步 synchronization,死锁 deadlock)        多线程的操作方法            1.线程同步的产生与解决        2.死锁的问题     ...