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. RMQ、ST表

    ST表 \(\text{ST}\) 表是用于解决可重复贡献问题的数据结构. 可重复贡献问题:区间按位和.区间按位或.区间 \(\gcd\) .区间最大.区间最小等满足结合律且可重复统计的问题. 模板预 ...

  2. 最接近的数 牛客网 程序员面试金典 C++ Python

    最接近的数 牛客网 程序员面试金典 C++ Python 题目描述 有一个正整数,请找出其二进制表示中1的个数相同.且大小最接近的那两个数.(一个略大,一个略小) 给定正整数int x,请返回一个ve ...

  3. cm2 逆向分析

    目录 cm2 逆向分析 前言 查壳 逆向分析 encrypt函数 POC代码 cm2 逆向分析 前言 这是逆向实战之CTF比赛篇的第3篇,在这里我就不再讲的特别小白了,有些简单操作可能会略过. 查壳 ...

  4. Vue2高级原理

    <div id="app">     <input type="text" v-model="username"> ...

  5. 什么是操作系统fork()进程

    1.fork()是创建进程函数. 2.c程序一开始,就会产生 一个进程,当这个进程执行到fork()的时候,会创建一个子进程. 3.此时父进程和子进程是共存的,它们俩会一起向下执行c程序的代码. 4. ...

  6. Linux题目学习

    一.填空题: 1. 在Linux系统中,以 文件 方式访问设备 . 2. Linux内核引导时,从文件/etc/fstab 中读取要加载的文件系统. 3. Linux文件系统中每个文件用 i节点来标识 ...

  7. python语法与pycharm的基本使用

    内容概要 pycharm基本使用 python注释语法 变量与常量 垃圾回收机制 数据类型 1. pycharm基本使用 pycharm安装完成后首次打开要注意: 文件路径(不要选择C盘) pytho ...

  8. Linux&C open creat read write lseek 函数用法总结

    一:五个函数的参数以及返回值. 函数                                 参数                      返回值     open (文件名,打开方式以及读 ...

  9. pycharm 在flask断点不停止

    For me disabling Gevent compatible option in Preferences > Build, Execution, Deployment has helpe ...

  10. airflow 安装问题

    sasl Debian/Ubuntu: apt-get install python-dev libsasl2-dev gcc CentOS/RHEL: yum install gcc-c++ pyt ...