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-fawk-script-fileinput-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则是文件的实际大小。

linux du -sh 脚本,Linux之shell脚本(2)相关推荐

  1. 【CyberSecurityLearning 34】Linux脚本编写(Shell脚本)

    目录 脚本 一个简单的脚本 实现流程: 变量赋值 IF判断语句 if单分支结构 if 双分支结构 if 多分支结构 实用案例:检测内网主机存活状态 Shell循环语句(for.while) for循环 ...

  2. linux脚本编写规则,shell脚本编写守则

    现在centos7中使用的是bash软件,通过以下命令可以查看bash版本: [root@localhost ~]# cat /etc/redhat-release #查看系统的版本 CentOS L ...

  3. linux 脚本 获取pid,Shell脚本中获取进程ID的方法

    提问: 我想要知道运行中脚本子shell的进程id.我该如何在shell脚本中得到PID. 当我在执行shell脚本时,它会启动一个叫子shell的进程.作为主shell的子进程,子shell将she ...

  4. 【跟晓月学shell脚本】掌握shell脚本变量原理及概念

    前言 跟晓月一起学shell,死磕shell脚本,让shell脚本学习不再难. 想学习更多shell脚本的案例,可以前往我的师父的shell脚本专栏:shell脚本从入门到实战-案例篇 文章目录 前言 ...

  5. Tcl/Tk脚本中执行Shell脚本

    在Tcl/Tk脚本中执行Shell命令 set n 0 set x "*"while {$n < 10} {puts $xset x "$x"*set n ...

  6. 什么是脚本语言,shell脚本又是什么?

    脚本语言就是解释型语言: 脚本语言(Script language,scripting language,scripting programming language)是为了缩短传统的编写-编译-链接 ...

  7. 【跟晓月学shell脚本】掌握shell脚本变量实战案例

    前言 上篇文章我们探讨了shell脚本变量的基本原理和概念,本篇我们基于上面的内容增加一些实战. 如果你还没有学习shell脚本的变量理论,可以点击链接:[跟晓月学shell脚本]掌握shell脚本变 ...

  8. linux 递归删除 空目录命令,使用shell脚本实现递归删除空目录

    平时一般使用php脚本实现一些文件管理功能,总归没有shell脚本强大,虽然本人不会写shell脚本,但是读懂shell脚本还是没问题的.对于"递归删除空目录"这样简单的功能使用p ...

  9. linux脚本基本命令大全,Shell脚本常用命令

    Shell脚本常用命令 1           Shell中的特殊符号 1.1           $  美元符号.用来表示变量的值.如变量NAME的值为Mike,则使用$NAME就可以得到" ...

最新文章

  1. 复杂个人信息输出程序python_Python高级技巧:用一行代码减少一半内存占用
  2. Spring的静态注入
  3. linux通过rinetd工具进行端口映射/转发/重定向
  4. 好好学python · 你真的会列表吗(列表推导式质检员)
  5. redis 亿级查询速度_亿级流量系统架构之如何保证百亿流量下的数据一致性(上)...
  6. newcode Islands 思维
  7. 没有系列化导致错误:java.io.NotSerializableException: com.bjpowernode.bean.Team
  8. python闭合函数_Python中函数的闭包
  9. 一页纸项目管理图书和简单模板
  10. 【C语言练习——打印上三角及其变形】
  11. 32位ubuntu 编译android源码,ubuntu 下编译android源码错误解决记录
  12. 深圳市社会医疗保险门诊大病管理办法
  13. 根据股票涨跌用KMeans进行分类
  14. 怎么写竞品分析报告(思路):
  15. cannot find -lxxx 问题的总结
  16. java五子棋棋盘_java绘制五子棋棋盘代码示例
  17. AIR - 网页系统回到桌面应用
  18. Hash(散列)冲突解决 线性探测再散列和二次探测再散列
  19. 有没有免费的视频剪辑软件?快来看看这些视频裁剪软件
  20. 快速云:如何保护您的域名系统免遭劫持

热门文章

  1. linux nfs命令,linux命令:NFS服务
  2. lte核心网由哪些设备组成_投影地面互动的实现由哪些设备组成?「振邦视界」...
  3. android 如何使用aar,Android Studio如何使用aar依赖包?
  4. python自动拨号_Python自动连接ssh的方法
  5. python玩转android_如何用python玩跳一跳 ?(安卓版)
  6. 数字图像处理 第一章 概述
  7. Python学习笔记(运算符)
  8. Python面试题大全(二):python高级语法
  9. C++校招常见面试题(2019年校招总结)
  10. 在ARM Cortex-M上实现FreeRTOS性能计数器