Shell高级

一.shell置换和引用

1.什么是置换和引用

在shell中具有很多特殊意义的字符(*、?、\等),shell将包含元字符的字符串根据其意义转换成新字符串的过程称为置换;关闭shell对特殊字符含义的解析处理被称为引用。

2.Shell置换的类型

(1)文件名置换

l元字符

-* 匹配所有字符

-? 匹配所有单个字符

-[]  匹配括弧内的字符

-[!] 匹配除括弧内的其他字符

l实例

-#ls  abc*

-#ls  ?abc

-#ls  [abc]*

-#ls  [!a]*

(2)变量置换

l$varname和${varname}  置换变量的值,引用指定变量名的值

l${varname:+value}   判断varname变量是否设置,如果设置了,则显示value,否则显示空

l${varname:?value}  如果变量varname变量未设置/为空,则显示错误信息value

l${varname:-value}  如果变量varname变量未设置/为空,则显示value

l${varname:=value}  如果变量varname变量未设置/为穿,则显示value,并将value值赋给varname变量

(3)命令置换

l使用`命令`,置换命令的结果。如cat `ls /etc/grub.conf`

l使用$(命令)方式置换命令的结果。如cat $(ls /etc/grub.conf)

(4)运算式置换

l使用$((算术表达式))置换表达式的结果。如a=$( (1 + 1 ))

l使用declare/let定义整型变量和给变量赋值。如let a=5+5

3.Shell引用

l使用“\”取消其后面的特殊字符的含义,特殊字符有* ? [] ‘ ’  “ ”  \ $ ; & ( ) | ^ ! #;如“abc\*”.

l使用‘’引用所有被括起来的字符,如echo ‘$a*’

l使用“”引用所有除$和`以外的字符

二.文本过滤

1.什么是文本过滤

文本过滤指的是提取指定文件中的部分内容或替换指定文本文件中的字符串

2.文本过滤的命令

(1)head

功能:输出文件头部n行

格式:head  -n 文件名

实例:#head -3  /etc/passwd

(2)tail

功能:输出文件尾部n行或监控文件

格式:tail +n/-n/-f  文件

实例:#tail –3 /etc/passwd

#tail +3 /etc/passwd

#tail –f /etc/passwd

(3)uniq

功能:检查及删除文本文件中重复出现的行列

格式: uniq [选项] [输入文件][输出文件]

选项:

-c   在每列旁边显示该行重复出现的次数。

-d  仅显示重复出现的行列。

-f   忽略比较指定的栏位。

-s  忽略比较指定的字符。

-u   仅显示出现一次的行。

-w  指定要比较的字符。

实例:

#uniq  -u  /root/aa

#uniq  -dc /root/aa

(4)sort

功能:对文件进行排序/合并

格式:sort  [选项]  文件名

选项:

-d:按字典顺序(只对空格/字母/数字)

-f:忽略大小写

-t:指定分隔符

-r反向

-n按数字大小显示

-c只检查是否有序,不实际排序

-u消除重复行

实例:

#sort -r  /etc/passwd

#sort +1-2  /etc/passwd

(5)grep

功能:在文本文件中查找匹配的字符串

格式:#grep [参数] “字符串”  文件

参数:

-?同时显示匹配行上下的?行

-b在匹配行前面打印该行所在的块号

-c只打印匹配的行数,不显示匹配的内容

-f File从文件中提取模板,空文件中包含0个模板,所以什么都不匹配

-h当搜索多个文件时,不显示匹配文件名前缀

-I忽略大小写差别

-q取消显示,只返回退出状态。0则表示找到了匹配的行

-l打印匹配模板的文件清单

-L打印不匹配模板的文件清单

-n在匹配的行前面打印行号

-s不显示关于不存在或者无法读取文件的错误信息

-v反检索,只显示不匹配的行

-w如果被\引用,就把表达式做为一个单词搜索

正则表达式元字符:

^

锚定行的开始 如:'^grep'匹配所有以grep开头的行

$

锚定行的结束 如:'grep$'匹配所有以grep结尾的行

.

匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p

*

匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。.*一起用代表任意字符

[]

匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep

[^]

匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行

\(..\)

标记匹配字符,如'\(love\)',love被标记为1

\<

锚定单词的开始,如:'\

\>

锚定单词的结束,如:'grep\>'匹配包含以grep结尾的单词的行

x\{m\}

重复字符x,m次,如:'0\{5\}'匹配包含5个o的行

x\{m,\}

重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行

x\{m,n\}

重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行

实例:

# ls -l | grep '^a'

通过管道过滤ls-l输出的内容,只显示以a开头的行。

# grep 'test' d*

显示所有以d开头的文件中包含test的行。

# grep 'test' aa bbcc

显示在aa,bb,cc文件中匹配test的行。

# grep '[a-z]\{5\}'aa

显示所有包含每个字符串有5个连续小写字符的字符串的行。

# grep 'w\(es\)t.*\1'aa

如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着另外一个es(\1),找到就显示该行。如果用egrep或grep -E,就不用"\"号进行转义,直接写成'w(es)t.*\1'就可以了。

(6)sed

功能:Sed(a stream editor)是流线型、非交互式编辑器。它允许你执行与vi编辑器里一样的编辑任务。Sed 程序不是与编辑器交互式工作的,而是让你在命令行里敲入编辑的命令,给文件命名,然后在屏幕上查看命令输出结果。

格式:sed   [选项]   sed子命令 输入文件  [输出文件]

子命令:

p打印匹配行

=显示文件行号

a \在定位行号后附加新文本信息

i \在定位行号前插入新文本信息

d删除定位行

c \用新文本替换定位文本

s使用替换模式替换相应模式

r从另一个文件中读文本

w写文本到一个文件

q第一个模式匹配完成后推出或立即推出

{ }在定位行执行的命令组

n从另一个文件中读文本下一行,并附加在下一行

y传送字符

n延续到下一输入行;允许跨行的模式匹配语句

实例:

1>打印:p命令

#sed '/north/p'datafile

默认输出所有行,找到north的行重复打印

#sed –n '/north/p'datafile

禁止默认输出,只打印找到north的行

#sed -n'/west/,/east/p' datafile

打印在west和east之间的模式范围内所有行。

2>删除:d命令

#sed '3d' datafile

删除第三行,其余行输出到屏幕

#sed '3,$d' datafile

从第3行到最后一行都删除,将剩余部分输出到屏幕

#sed '/north/d'datafile

将含有north的行删除,其余输出到屏幕

3>替换:s命令

#sed 's/west/north/g'datafile

找到datafile中的所有west并替换成north,将替换后的内容输出到屏幕。

#sed -n's/Hemenway/Jones/gp' datafile

所有的Hemenway所在的位置都用Jones来取代,而且只有改变的行被打印。

#sed -n's/\(Mar\)got/\1ianne/p' datafile

模式Mar被封装在括弧里且在一个专用寄存器里存为标记1。在替换串里它将被引用做\1。然后用Marianne替代Margot。

4>多次编辑 -e 选项

#sed -e '1,3d' -e's/Hemenway/Jones/' datafile

5>从文件中读取:r命令

#sed '/Suan/rnewfile' datafile

r命令从newfile中读取内容,将内容输出到Suan的后面。

6>写入文件:w命令

#sed -n '/north/wnewfile' datafile

w命令把指定的行写入到一个文件。

7>添加:a命令

#sed '/north/a\ THENORTH SALES DISTRICT HAS MOVED

奇怪的是a\后面必须另起一行,在输入要添加的内容,否则会提示解析错误。

8>插入:i命令

# sed '/north/i\ THENORTH SALES DISTRICT HAS MOVED' datafile

在符合模式的行前面插入内容。其余和a\命令相同。

9>下一个:n命令

#sed'/eastern/{n;s/AM/Archie/;}' datafile

10>变换:y 命令

#sed'1,3y/abcdefghijklmnopqrst/ABCDEFGHIJKLMNOPQRST/' datafile

将对应字母进行转换。

11>退出:q 命令

#sed '5q' datafile

在打印了5行之后,用q命令退出sed程序。

三.Awk

1.什么是awk

Awk是一种程序语言,对文本文件的处理具有很强的功能,如修改、比较、提取、打印等。awk语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息。awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。

2.如何执行awk程序

Awk程序可以直接在命令行中执行,也可以存放在文件然后在命令行调用。

方法一:直接在命令行中执行

#gawk ‘program’  input-file1 input-file2…

方法二:调用awk程序文件

#gawk –f  program-file input-file1  input-file2…

任何a w k语句都由模式和动作组成。在一个a w k脚本中可能有许多语句。模式部分决定动作语句何时触发及触发事件。处理即对数据进行的操作。如果省略模式部分,动作将时刻保持执行状态。模式可以是任何条件语句或复合语句或正则表达式。

模式包括两个特殊字段B E G I N和E N D。使用B E G I N语句设置计数和打印头。B E G I N语句使用在任何文本浏览动作之前,之后文本浏览动作依据输入文件开始执行。E N D语句用来在a w k完成文本浏览动作后打印输出文本总数和结尾状态标志。如果不特别指明模式,a w k总是匹配或打印行数。

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

3.认识文件中的记录和域

域1分隔符域2分隔符域3分隔符域4

abc     #        0 2 / 9 9     #          4 8         #            fine

l默认文件中以换行符结束的行称为记录,awk中可以指定记录分隔符,也可以用$0引用整个记录

l记录是由若干个域构成的,域之间由指定的分隔符隔开,默认分隔符为空格。可以用$1…$n引用记录中的各个域

4.正则表达式和运行算符

(1)算术运算符:+ -*、/ %(取余) ^(乘方)

(2)关系运算符:< > <= >= == !=  ~(匹配)  !~(不匹配)

(3)逻辑运算符:&& || !

(4)赋值运算符:= += -= *= /= %= ^=

(5)自增、自减运算符:++ --

(6)数组引用:in

5.awk变量和数组

(1)awk变量分为数值型和字符型,用户引用变量时即定义了变量,变量类型由变量内容决定,引用变量时不用加$。

(2)awk内置变量如下

lARGC命令行参数的数目。

lARGIND命令行中当前文件的位置(从0开始算)。

lARGV包含命令行参数的数组。

lCONVFMT数字转换格式(默认值为%.6g)

lENVIRON环境变量关联数组。

lERRNO最后一个系统错误的描述。

lFIELDWIDTHS字段宽度列表(用空格键分隔)。

lFNR同NR,但相对于当前文件。

lFS字段分隔符(默认是任何空格)。

lIGNORECASE如果为真,则进行忽略大小写的匹配。

lNF当前记录中的字段数。

lNR当前记录数。

lOFMT数字的输出格式(默认值是%.6g)。

lOFS输出字段分隔符(默认值是一个空格)。

lORS输出记录分隔符(默认值是一个换行符)。

lRLENGTH由match函数所匹配的字符串的长度。

lRS记录分隔符(默认是一个换行符)。

lRSTART由match函数所匹配的字符串的第一个位置。

lSUBSEP数组下标分隔符(默认值是\034)。

(3)awk数组

awk允许使用数组,数组的格式如下。

Varname[下标]

awk数据组的下标可以数字(从1开始)和字符表示,name[1]、name[a]。

6.awk输出命令

输出命令是awk最常用的操作命令,它包含print和printf两种方式。

(1)print

#awk  ‘{print $0}’  /etc/passwd

(2)printf(格式化输出)

格式:printf “输出格式”,表达式

实例:#awk ‘{printf “user name:%s”,%1’} /etc/passwd

注:print和printf语句中常用的转义字符和格式符

-转义字符

l\t  table制表位

l\n换行符

l\\表示“\”

l\b表示退格

-格式符

l%c输出单个字符

l%d %i输出整数

l%e按科学计数法输出小数

l%f输出浮点数

l%s输出字符串

l%%输出%

7.Awk控制语句

(1) if语句

功能:实现条件分支

格式:if (expr) {action1}

else {action2}

实例:#awk  -F: ‘{if  ($3==0) {print $0}}’ /etc/passwd

(2)for语句

功能:实现循环执行

格式:for (init_cntr;test_cntr;incr_cntr){action}

实例:#awk ‘{for(i=1;i<5;i++) {printf “%s”,$i;printf “:”} print “\n”}’

(3)while语句

功能:实现循环执行

格式:while (expr){action}

实例:#awk ‘{i=1;while(i<5) {printf “%s”,$i;printf “:”} print “\n” }’

注:还有一种do…while形式

(4)break和continue

退出循环和进行下一次循环

(5)exit

退出awk

(6)next

跳过后面内容,读取下一行

8.awk函数

length(string)求串string中的字符个数

index(search,string)返回string中search串的位置

match(string,reg)返回常规表达式reg匹配的string中的位置

sub(reg,string,target)第一次当常规表达式reg匹配,替换target串中的字符串

substr(string,position,len)返回一个以position开始len个字符的子串

totower(string)返回string中对应的小写字符

toupper(string)返回string中对应的大写字符

split(string,store,delim)根据分界符delim,分解string为store的数组元素

sprintf(format,variable) 返回一个包含基于format的格式化数据,variables是要放到串中的数据

strftime(format,timestamp)返回一个基于format的日期或者时间串,timestmp是systime()函数返回的时间

srand(x)初始化随机数发生器。如果忽略x,则使用system()

system()返回自1970年1月1日以来经过的时间(按秒计算)

rand() 0-1之间的随机数

9.Awk脚本实例

#vi  /awk/st1.awk

#!/bin/awk -f

#to call:du|duawk.awk

#prints file/direc's in bytes and blocks

BEGIN{

OFS="\t";

print "name" "\t\t","bytes","blocks\n"

print "==============================="}

{print $2,"\t\t",$1*512,$1}

#chmod a+x/awk/st1.awk

#du|awk/st1.awk

微信扫一扫 、关注公众号

不定时分享资料视频

linux+用户的shell,Linux用户管理(十)Linux Shell高级相关推荐

  1. linux本地yum源与软件包管理,【Linux系统中的】本地yum源的搭建与使用yum源进行软件的下载...

    前言: 当我们在使用Linux系统时,有时需要一些辅助工具帮助我们实现某项功能, 例如画图.wps.等功能,而这些功能并不是系统自带的,需要我们下载相关的 软件,那如何去下载这些软件那,这里我们不得不 ...

  2. linux如何改文件用户组权限,linux修改文件权限和用户组管理小结

    如何在linux下修改组权限 chmod g+r path/file 加读权限 当前目录 chmod -R g+r path/file 加读权限 当前目录以及子目录 g-r 减读权限 g+w 加写权限 ...

  3. linux 内存管理 ppt,Linux内存管理 Memory Manager.ppt

    <Linux内存管理 Memory Manager.ppt>由会员分享,可在线阅读,更多相关<Linux内存管理 Memory Manager.ppt(24页珍藏版)>请在人人 ...

  4. Linux学习(四)---用户管理

    文章目录 Linux学习--用户管理 一.基本介绍 二.添加用户 2.1 基本语法 2.2 实际案例 2.3 细节说明 三.给用户指定或者修改密码 四.删除用户 4.1基本语法 4.2 应用案例 五. ...

  5. 用户管理 之 Linux 系统中的超级权限的控制

    作者:北南南北 赞助: eTony,pandonny,懒猫, Arch 来自:LinuxSir.Org 摘要: 超级用户是系统最高权限的拥有者,是系统管理唯一的胜任者:由于权限的超级并且达到无所不能的 ...

  6. 用户管理 之 Linux 用户管理工具介绍

    作者:北南南北 赞助: 来自:LinuxSir.Org 摘要: 本文主要介绍Linux系统的用户和用户组的查询.添加.修改及删除等管理工具: 目录索引 一.与用户管理相关的配置文件: 1./etc/p ...

  7. linux账号5天锁定,Linux学习之六(Linux用户、权限、用户管理命令)2017-03-31

    一.用户.组.权限 用户:UID,/etc/passwd 组:GID,/etc/group 二.影子口令: 用户:/etc/shadow 组:/etc/gshadow 三.用户类别: 管理员:0 普通 ...

  8. Linux CentOS 8(用户与组相关权限管理实验)

    Linux CentOS 8(用户与组相关权限管理实验) 目录 一.项目介绍 二.相关概念 2.1 用户管理简介 2.2 在 Linux 中每个文件的所有者.所在组.其它组的概念 三.任务操作 任务1 ...

  9. Linux实战教学笔记14:用户管理初级(上)

    第十四节 用户管理初级(上) 标签(空格分隔): Linux实战教学笔记-陈思齐 ---更多资料点我查看 1,账号管理 1.1 管理用户命令汇总 命令 注释说明(特殊颜色的必须掌握) useradd增 ...

  10. linux组的管理命令,Linux用户与组管理命令

    1.列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可. who | cut -d" " -f1 | sort -u 或 who | cut -d ...

最新文章

  1. Oracle数据库迁移
  2. WordCount作业提交到FileInputFormat类中split切分算法和host选择算法过程源码分析
  3. vivado软件如何查看内部器件的仿真信号
  4. Vue——基础(对象、属性样式操作、条件、循环、事件、绑定)
  5. 你大爷还是你大爷!三星震撼首发折叠屏智能手机Galaxy Fold
  6. 正则表达式中或关系表示及查找英文字母最后一个
  7. 1、爱因斯相对论(狭义相对论)
  8. 3S基础知识:MapX应用教程—创建地图对象
  9. 做到心云社客这三点,你也拥有很多网络赚钱机会
  10. 拼音输入法技巧-智能ABC
  11. VS2019企业版密钥
  12. 您需要计算机管理员权限,计算机中出现“你需要计算机管理员提供的权限才能对此文件进行更改”错误的解决方法...
  13. 计算机网络之数据链路层原理
  14. [HNOI2003]激光炸弹(二维前缀和+大坑点)
  15. android 控制POS机图文打印(一)
  16. STM32,三色灯组合任意颜色
  17. Tensorboard可视化神经网络详细教程
  18. 数学----常见函数求导过程
  19. ubuntu10.04安装有线网卡驱动
  20. oracle sql子串替换,【总结】Oracle sql 中的字符(串)替换与转换

热门文章

  1. Failed to fetch http://mirrors.cloud.aliyuncs.com/
  2. httpd.2.4虚拟主机配置测试
  3. redhat enterprise linux 下配置本地yum源
  4. 5.JasperReports学习笔记5-其它数据生成动态的报表(WEB)
  5. python 输出大文本文件
  6. Oracle procedure
  7. [置顶]一步步构建大型网站架构
  8. 为什么百度只收录我的网站首页?
  9. Java中BASE64 编码
  10. 区块链+能源,能擦出什么样的火花?