Linux之shell脚本(2)

printf命令:

printf是一个把从标准输入的字符按照你所要求的格式输出到标准输出即屏幕的命令. 在很多时候,我们可能需要将自己的数据给他格式化输出的。

1.格式化输出。(print  format)

2.命令格式:printf'打印格式'实际内容

3.打印格式:

1)\a(警告声音输出)

2)\b(退格键)

3)\f(清除屏幕,类似换纸)

4)\n(输出新的一行)

5)\r(帧处于行的开始,即enter键)

6)\t(水平的table键)

7)\v(垂直的table键)

8)\xNN(x为ASCII码十六进制表示;NN为俩位数数字;可转换数字成为字符)

9)%ns(n为数字;s代表string,即多少个字符)

10)%ni(n为数字;i代表integer,即多少整数字符)

11)%N.nf(n、N为数字;f代表floating浮点,小数字数即小数点)

案例:

1)以整数形式输出23并换行,以字符串形式输出hello并换行

2)以2位整数形式输出23并换行,以7位字符串形式输出hello并换行

案例文本:

考试分数的输出:假设有一个文件test.txt记录着考试分数,内容如下图所示:

3)如下图所示,printf命令的输出结果并没有对齐,%s代表一个不固定长度的字符串,而字符串与字符串中间就以 \t 这个 [tab] 分隔符来处理。既然每个字段的长度不固定会造成上述的困扰,那我将每个字段固定就好啦。

将test.txt文件中的内容,分别以字符串、整数、小数点来显示:

上面的格式共分为五个字段,%10s 代表的是一个长度为 10 个字符的字符串字段,%5i 代表的是长度为 5 个字符的数字字段,至于那个 %8.2f 则代表长度为 8 个字符的具有小数点的字段,其中小数点有两个字符宽度;全部的宽度仅有 8 个字符,整数部分占有 5 个字符,小数点本身 (.) 占一位,小数点后的位数则有两位。

二、awk命令:

awk也是一个数据处理工具!相较于 sed 常常作用于一整个行的处理, awk 则比较倾向于一行当中分成数个字段来处理。

.awk语言的最基本功能是在文件或字符串中基于指定规则来分解抽取信息,也可以基于指定的规则来输出数据。

有三种方式调用awk

1)命令行方式

awk   [-F  field-separator]  'commands'  input-files

其中,[-F域分隔符]是可选的,因为awk使用空格或tab键作为缺省的域分隔符,因此如果要浏览域间有空格的文本,不必指定这个选项,如果要浏览诸如passwd文件,此文件各域以冒号作为分隔符,则必须指明-F选项,如:awk -F: 'commands' input-file。

注:在linux系统中用环境变量IFS存储分隔符,但根据实际应用也可以改变IFS的值.

例如:查看默认分隔符。

注意:oldIFS=$IFS(把环境变量IFS存到oldIFS)

IFS=","(定义分隔符为,)

2)shel脚本方式

将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用。

相当于shell脚本首行的:#!/bin/sh可以换成:#!/bin/awk

3)将所有的awk命令插入一个单独文件,然后调用:

Awk -f awk-script-file input-files

其中,-f选项加载awk-script-file中的awk脚本,input-files跟上面的是一样的。

awk的模式和动作

任何awk语句都由模式和动作组成(awk_pattern { actions })。
在一个awk脚本中可能有许多语句。

模式部分决定动作语句何时触发及触发事件。处理即对数据进行的操作。如果省略模式部分,动作将时刻保持执行状态。即省略时不对输入记录进行匹配比较就执行相应的actions。

模式可以是任何条件语句或正则表达式等。awk_pattern可以是以下几种类型:

①正则表达式(/regexp/)

②布尔表达式用作awk_pattern,表达式成立时,触发相应的actions执行。

(1)表达式中可以使用变量(如字段变量$1,$2等)和/regexp/

(2)布尔表达式中的操作符:

关系操作符: < > <= >= == !=
匹配操作符: value ~ /regexp/ 如果value匹配/regexp/,则返回真
value !~ /regexp/ 如果value不匹配/regexp/,则返回真

(3)&&(与) 和 ||(或) 可以连接两个/regexp/或者布尔表达式,构成混合表达式。!(非) 可以用于布尔表达式或者/regexp/之前。

例如:提取test.txt中chinese大于75为优秀。

例如:提取passwd中匹配d开头的显示ok。

例如:模式包括两个特殊字段 BEGIN和END。使用BEGIN语句设置计数和打印头。BEGIN语句使用在任何文本浏览动作之前,之后文本浏览动作依据输入文本开始执行。END语句用来在awk完成文本浏览动作后打印输出文本总数和结尾状态标志。

动作:

实际动作在大括号{ }内指明。动作大多数用来打印,但是还有些更长的代码诸如i f和循环语句及循环退出结构。如果不指明采取动作,awk将打印出所有浏览出来的记录。

awk执行时,其浏览域标记为$1,$2...$n。这种方法称为域标识。使用这些域标识将更容易对域进行进一步处理。

使用$1 , $3表示参照第1和第3域,注意这里用逗号做域分隔。如果希望打印一个有5个域的记录的所有域,不必指明$1 , $2 , $3 , $4 , $5,可使用$0,意即所有域。为打印一个域或所有域,使用print命令。这是一个awk动作

awk的运行过程:

① 如果BEGIN 区块存在,awk执行它指定的actions。

②  awk从输入文件中读取一行,称为一条输入记录。(如果输入文件省略,将从标准输入读取)

③  awk将读入的记录分割成字段,将第1个字段放入变量$1中,第2个字段放入$2,以此类推。$0表示整条记录。

④  把当前输入记录依次与每一个awk_cmd中awk_pattern比较,看是否匹配,如果相匹配,就执行对应的actions。如果不匹配,就跳过对应的actions,直到比较完所有的awk_cmd。

⑤  当一条输入记录比较了所有的awk_cmd后,awk读取输入的下一行,继续重复步骤③和④,这个过程一直持续,直到awk读取到文件尾。

⑥  当awk读完所有的输入行后,如果存在END,就执行相应的actions。

awk入门实例:

例1:显示/etc/passwd文件中用户名和登录shell

例2:显示/etc/passwd文件中用户名和登录shell,中间以tab分隔

例3:显示/etc/passwd文件中用户名和登录shell,中间以逗号分隔

例4:显示/etc/passwd文件中UID大于500的所有用户的用户名和登录shell

例5:显示/etc/passwd文件中的UID大于500的用户名和登录shell,而账户与shell之间以逗号分割,而且在所有行添加列名name,shell,在最后一行添加"blue,/bin/nosh"。

1.awk 后面接两个单引号并加上大括号 {} 来设定想要对数据进行的处理动作

2.awk工作流程是这样的:先执行BEGING,然后读取文件,读入有\n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。

六、函数及脚本的综合应用

 

1、shell函数:shell允许将一组命令集或语句形成一个可用块,这些块称为shell函数。

函数由两部分组成:函数标题、函数体。

标题是函数名。函数体是函数内的命令集合。

标题名应该唯一;如果不是,将会混淆结果,因为脚本在查看调用脚本前将首先搜索函数调用相应的shell。

2、定义函数的格式为:

函数名(){

命令1

...

}

如果愿意,可在函数名前加上关键字function,这取决于使用者。

function函数名()

{

命令1

...

}

例如:

脚本案例:

案例一、删除文件中的空行:

这个脚本(脚本名为del.lines)可以处理一个或多个文件。每个文件在用sed删除空行之前要先核实是否存在。

sed的输出被导入一个文件名中含有$ $的临时文件,最后这个临时文件又被移回到原来的文件中。

该脚本使用shift命令取得所有的文件名,用while循环逐个处理所有的文件,直至处理完

为止。可以使用del.lines --help获得一个简短的帮助

chmod  +x  del.lines,增加执行权限,

测试如下:

注:

1、basename命令能够从路径中分离出文件名。通常用于shell脚本中

2、shift语句用于迁移位置变量,将 $1~$9 依次向左传递

例如,若当前脚本程序获得的位置变量如下:

$1=file1、$2=file2、$3=file3、$4=file4

则执行一次shift命令后,各位置变量为:

$1=file2、$2=file3、$3=file4

再次执行shift命令后,各位置变量为:

$1=file3、$2=file4

案例二、日志文件超过长度,备份,清除内容:

脚本内容

注:du 并不是显示文件的实际大小,而是显示文件所占用的 block 大小,默认linux系统分区的 block size 是4k,也就是说即使文件只有1个字节,也会占用4k.
ls -l则是文件的实际大小。

转载于:https://blog.51cto.com/duyuheng/1942539

Linux之shell脚本(2)相关推荐

  1. linux shell脚本攻略_(python)Linux下shell脚本监控Tomcat的状态并实现自动启动步骤...

    今天为大家带来的内容是:(python)Linux下shell脚本监控Tomcat的状态并实现自动启动步骤 本文内容主要介绍了Linux下shell脚本监控Tomcat的状态并实现自动启动的步骤,文章 ...

  2. Linux环境Shell脚本上传下载阿里云OSS文件

    为什么80%的码农都做不了架构师?>>>    Linux环境Shell脚本上传下载阿里云OSS文件 背景 工作中由于我们项目生成的日志文件比较重要,而本地磁盘空间有限存储不了多久, ...

  3. 详解Linux交互式shell脚本中创建对话框实例教程

    详解Linux交互式shell脚本中创建对话框实例教程 本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一 ...

  4. Linux的shell脚本实战之while循环

    Linux的shell脚本实战之while循环 一.使用while循环计算 1.计算从1加到100之和 2.计算1-2+3-4+5....-100的值 二.while语句的三种方式 1.通过输入重定向 ...

  5. Linux下Shell脚本实战之监测磁盘空间

    Linux下Shell脚本实战之监测磁盘空间 一.脚本目的及要求 二.脚本内容 三.运行脚本 一.脚本目的及要求 (1) 监控/home下每各个用户目录的占用磁盘大小 (2) 监控/var/log下前 ...

  6. Linux下shell脚本之双色球摇号脚本

    Linux下shell脚本之双色球摇号脚本 一.脚本要求 二.脚本内容 三.运行脚本 一.脚本要求 二.脚本内容 三.运行脚本 一.脚本要求 1.编写脚本Lottery.sh,模拟摇号过程 2.6位数 ...

  7. Linux下shell脚本实战之批量新建用户

    Linux下shell脚本实战之批量新建用户 一.脚本要求 二.脚本内容 三.运行脚本 一.脚本要求 二.脚本内容 三.运行脚本 一.脚本要求 1.使用提供的user.txt用户列表 2.批量新建us ...

  8. Linux的shell脚本实战之检查主机IP是否存在

    Linux的shell脚本实战之检查主机IP是否存在 一.目的及要求 二.脚本内容 二.运行结果 一.目的及要求 二.脚本内容 二.运行结果 一.目的及要求 检查 192.168.200.130~14 ...

  9. Linux的shell脚本函数教程

    Linux的shell脚本函数教程 一.shell介绍 二.shell函数的介绍 三.函数的定义 四.shell中函数使用示例 一.shell介绍 二.shell函数的介绍 三.函数的定义 四.she ...

  10. Linux常用Shell脚本珍藏

    我们在运维中,尤其是linux运维,都知道脚本的重要性,脚本会让我们的 运维事半功倍,所以学会写脚本是我们每个linux运维必须学会的一门功课,这里收藏linux运维常用的脚本.如何学好脚本,最关键的 ...

最新文章

  1. java基础讲解05-----流程控制语句
  2. 国内pinterest发展介绍------瀑布流效果
  3. 【正一专栏】为何我们要侥幸而又苟且地活着
  4. SpringBatch顺序读取多文件(MultiResourceItemReader)和顺序写文件(MultiResourceItemWriter)(二)
  5. phpstudy mysql端口_完美解决phpstudy安装后mysql无法启动(无需删除原数据库,无需更改任何配置,无需更改端口)直接共存...
  6. 001-pro ant design 升级2.0后变更
  7. 【汇编语言】DEBUG的使用
  8. spring_01概念及案例
  9. java适合几岁的人学_Java适合什么人群学习?
  10. Java 用DBCP连接数据库。
  11. 2021-02-23 天地图图层类型总结
  12. php 5.6 mysql con,最新版的程序,支持PHP5.6和MYSQL5.6的环境吗
  13. vs安装msdn安装文档
  14. SPSS统计分析专题系列(一、认识SPSS)
  15. CISP 考试教材《第 8 章 知识域:物理与网络通信安全》知识整理
  16. Servlet和Servlet容器概念
  17. uva 10098 Generating Fast
  18. iPhone6和iPhone6Plus的适配
  19. LT7911D功能概述 LT7911D是Type-C/DP1.2转双路MIPI/Lvds的一款芯片
  20. python 渲染3d模型_Python中的3D软件渲染

热门文章

  1. 春节前51Aspx源码发布详情
  2. B cannot be cast to java.sql.Blob
  3. 某释放驱动的样本分析及手杀报告
  4. 发言稿开场白范文_万能演讲开场白范文
  5. 10双屏鼠标过不去_灵耀X2 Duo双屏笔记本是怎样“炼”成的?对话华硕笔记本设计团队...
  6. java+路径拦截实现_SpringBoot实现拦截器
  7. java scanner以回车结束_请问Scanner在输入回车后,如何才能退出?
  8. php 网站上传大小限制吗,配置PHP程序网站上传文件大小的限制!
  9. 控制元素显示和隐藏的方式及区别、内容溢出处理(区域滚动)、透明性、字体图标、常见字体、自定义字体设计、网站图标、CSS代码分析
  10. 2021年香水品牌社媒营销分析报告