1. 正则表达式
(1) 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配。grep、awk、sed等命令可以支持正则表达式;通配符用来匹配符合条件的文件名,通配符是完全匹配。ls、find、cp这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配了。
(2) 基础正则表达式
元字符 | 作用 |
* | 前一个字符匹配0次或任意多次 |
. | 匹配除了换行符外任意一个字符 |
^ | 匹配行首,如:^hello会匹配以hello开头的行 |
$ | 匹配行尾,如:hello$会匹配以hello结尾的行 |
[] |
匹配中括号中指定的任意一个字符,只匹配一个字符,如:[aoeiu]匹配任意一 个元音字符,[0-9]匹配任意一位数字,[a-z][0-9]匹配小写字母和一位数字构成的两位字符。 |
[^] | 匹配除中括号的字符以外的任意一个字符。 |
\ | 转义符,用于将特殊符号的含义取消 |
\{n\} | 表示其前面的字符恰好出现n次。如:[0-9]\{4\}匹配4位数字,[1][3-8][0-9]\{9\}匹配手机号码 |
\{n,\} | 表示其前面的字符出现不小于n次,如:[0-9]\{2,\}表示两位及以上的数字 |
\{n,m\} | 表示其前面的字符至少出现n次,至多出现m次。如:[a-z]\{6,8\}匹配6到8位的小写字母。 |
例:创建一个文件file,其内容如下:
[root@localhost sh]# vim file
Mr. Li said:
he was a lucky dog! But since he met Hamster,
he never saaaid those words.
6666unbelievable! because,in faaaact,
Hamster is the most lucky man! Later,Mr Li soid he would left.
#匹配所有内容,包括空白行
grep "a*" file #匹配至少包含一个a的行
grep "aa*" file #匹配至少包含两个连续a的字符串
grep "aaa*" file #匹配至少包含四个连续a的字符串
grep "aaaaa*" file
#"s..d"会匹配在s和d这两个字母间具有两个字符的单词
grep "s..d" file #匹配在s和d字母之间的具有任意字符的单词
grep "s.*d" file #匹配所有内容
grep ".*" file
#匹配大写M开头的行
grep "^M" file #匹配小写n结尾的行
grep "n$" file #匹配空白行
grep -n "^$" file
#匹配s和i之间要么是a,要么是o的行
grep "s[ao]id" file #匹配任意一个数字
grep "[0-9]" file #匹配小写字母开头的行
grep "^[a-z]" file
#匹配不用小写字母开头的行
grep "^[^a-z]" file #匹配不以字母开头的行
grep "^[^a-zA-Z]" file
#匹配以"."结尾的行
grep "\.$" file
#匹配a字母连续出现三次的字符串
grep "a\{3\}" file #匹配包含连续三个数字的字符串
grep "[0-9]\{3\}" file
#匹配至少用连续三个数字开头的行
grep "^[0-9]\{3,\}[a-z]" file
#匹配在字母s和i之间至少有1个a,最多有3个a的行
grep "sa\{1,3\}i" file
2. 字符截取命令
(1) cut字段提取命令
cut的格式为:cut [选项] 文件名
其中-f选项表示提取第几列,-d分隔符选项表示指定分隔符分割列。
例:有一个student.txt的文档,内容如下:
ID Name gender Mark
LiNing M
HanMei F
Jim M
① 提取单列:
[root@localhost sh]# cut -f student.txt
Name
LiNing
HanMei
Jim
② 提取多列:
[root@localhost sh]# cut -f , student.txt
Name Mark
LiNing
HanMei
Jim
③ 使用":"作为分隔符提取/etc/passwd中的第一列和第三列
[root@localhost sh]# cut -d ":" -f , /etc/passwd
root:
bin:
daemon:
adm:
lp:
④ 提取/etc/passwd中多个用户的用户名的方法:
[root@localhost sh]# cat /etc/passwd | grep /bin/bash | grep -v root | cut -d ":" -f
ws
user1
user2
user3
⑤ cut的局限
查询根分区(/dev/sda5)的内存占用量时,cut命令即无法识别,识别仅限于制表符或由具体分隔符的符号,无法识别空格分隔的符号。
[root@localhost ~]# df -h | grep "sda5" | cut -f
/dev/sda5 16G .8G 13G % /
(2) printf命令
printf的命令格式为:printf '输出类型输出格式' 输出内容
输出的类型包括:①%ns,表示输出字符串,n是数字指代输出几个字符;②%ni,输出整数,n指代输出几个数字;③%m.nf,输出浮点数,m和n是数字,指代输出的整数位数和小数位数。如%8.2f代表共输出8位数,其中2位是小数,6位是整数。
输出格式包括:
\a | 输出警告音 |
\b | 输出退格键 |
\f | 清空屏幕 |
\n | 换行 |
\r | 回车 |
\t | 水平输出退格键 |
\v | 垂直输出退格键 |
例:
[root@localhost sh]# printf %s [root@localhost sh]# printf %s %s %s
%s%s123456
#输出的数字每三个为一组,用单引号或双引号括起来输出格式
[root@localhost sh]# printf '%s %s %s' #加入换行符
[root@localhost sh]# printf '%s %s %s\n' #使用printf显示student.txt的内容(未调整格式)
[root@localhost sh]# printf "%s" $(cat student.txt)
IDNamegenderMark1LiNingM862HanMeiF903JimM83 #更改student.txt的内容
[root@localhost sh]# vim student.txt
ID Name PHP Linux MySQL gender Average
LiNing M 87.7
HanMei F 85.3
Jim M 91.7 #使用printf显示更改后的stdudent.txt内容
[root@localhost sh]# printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\n' $(cat student.txt)
ID Name PHP Linux MySQL gender Average
LiNing M 87.7
HanMei F 85.3
Jim M 91.7
在awk命令的输出中支持print和printf命令,二者的区别在于print会在每个输出之后自动加入一个换行符(Linux默认没有print命令),printf是标准格式输出命令,并不会自动加入换行符,如果需要换行,需手工加入。
(3) awk命令
awk的功能比cut强大,可以识别空格符作为分隔符。其格式为:
awk '条件1{动作1} 条件2{动作2}...' 文件名
其中,一般将条件表达式作为条件,如x>10,x>=10,x<=10,动作包含格式化输出及流程控制语句。awk实际上是逐行处理文本内容的。
#使用awk读取student.txt中的第2,7行
[root@localhost sh]# awk '{printf $2 "\t" $7 "\n"}' student.txt
Name Average
LiNing 87.7
HanMei 85.3
Jim 91.7 #读取df -h的第1,,6行内容
[root@localhost sh]# df -h | awk '{printf $1 "\t" $5 "\t" $6 "\n"}'
Filesystem Use% Mounted
/dev/sda5 % /
tmpfs % /dev/shm
/dev/sda1 % /boot
/dev/sda2 % /home
/dev/sdb1 % /root/disk1
/dev/sdb5 % /root/disk5 #结合使用awk和cut提取根分区(dev/sda5)的内存使用率
[root@localhost sh]# df -h | grep /dev/sda5 | awk '{print $5}' | cut -d "%" -f
① BEGIN字段表示在所有的命令执行之前执行BEGIN后的命令,然后再处理随后的动作。
[root@localhost sh]# awk '{print $2 "\t" $7} BEGIN{print "This is a transcript"}' student.txt
This is a transcript
Name Average
LiNing 87.7
HanMei 85.3
Jim 91.7
② FS内置变量用于指定分隔符,手工加入分隔符时,需强制将其设为BEGIN。
#打印出来的第一行数据未处理,因为先读入文本第一行,再进行处理的时候已略过第一行
[root@localhost sh]# awk '{FS=":"}{print $1 "\t" $3}' /etc/passwd
root:x:::root:/root:/bin/bash
bin
daemon #因此,需要加上BEGIN字段执行
[root@localhost sh]# awk '{print $1 "\t" $3} BEGIN{FS=":"}' /etc/passwd
root
bin
daemon
③ END字段表示其他命令执行完之后执行END后命令。
[root@localhost sh]# awk 'END{print "END!!"} {print $2 "\t" $7}' student.txt
Name Average
LiNing 87.7
HanMei 85.3
Jim
④ 关系运算符
#提取平均成绩大于87的Name字段
[root@localhost sh]# cat student.txt | grep -v Name | awk '$7>=87{print $2}'
LiNing
Jim
(4) sed命令
sed是一种几乎包含所有UNIX平台(包括Linux)的轻量级编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令。vi命令只能修改文本内容,sed命令既可以修改内容,可以修改命令的结果,shell编程中常用。其格式为:
sed [选项] '[动作]' 文件名
其中:一般sed命令会把所有数据都输出到屏幕,如果加入-n选项,则只会把经过sed命令处理的行输出到屏幕上;-e命令允许对输入数据应用多条sed命令编辑;-i选项表示用sed的修改结果直接修改读取数据的文件,而不是输出到屏幕。
sed中的动作包括:
a \ | 追加,在当前行后追加一行或多行。添加多行时,出最后一行外,每行末尾需要用"\"代表数据未完结 |
c \ | 行替换,用c后面的字符串替换原数据行,替换多行时,出最后一行外,每行末尾需用"\"代表数据未完结 |
i \ | 插入,在当前行前插入一行或多行,插入多行时,除最后一行外,每行末尾需用"\"代表数据未完结 |
d | 删除指定行 |
p | 打印输出指定行 |
s | 字串替换,用一个字符串替换另外一个字符串。格式为"行范围s/旧字串/新字串/g" |
例:
#输出student.txt的第二行
[root@localhost sh]# sed '2p' student.txt
ID Name PHP Linux MySQL gender Average
LiNing M 87.7
LiNing M 87.7
HanMei F 85.3
Jim M 91.7 #加入-n选项
[root@localhost sh]# sed -n '2p' student.txt
LiNing M 87.7 #删除第二行到第四行的数据,但不修改文件本身
[root@localhost sh]# sed '2,4d' student.txt
ID Name PHP Linux MySQL gender Average #在第二行后追加hello
[root@localhost sh]# sed '2a hello' student.txt
ID Name PHP Linux MySQL gender Average
LiNing M 87.7
hello
HanMei F 85.3
Jim M 91.7 #在第二行前插入两行数据
[root@localhost sh]# sed '2i hello \
> world' student.txt
ID Name PHP Linux MySQL gender Average
hello
world
LiNing M 87.7
HanMei F 85.3
Jim M 91.7 #数据替换
[root@localhost sh]# sed '2c No such person' student.txt
ID Name PHP Linux MySQL gender Average
No such person
HanMei F 85.3
Jim M 91.7 #字串替换
#将第三行的72换成100
[root@localhost sh]# sed '3s/72/100/g' student.txt
ID Name PHP Linux MySQL gender Average
LiNing M 87.7
HanMei F 85.3
Jim M 91.7 #同时把LiNing和Jim替换为空
[root@localhost sh]# sed -e 's/LiNing//;s/Jim//g' student.txt
ID Name PHP Linux MySQL gender Average
M 87.7
HanMei F 85.3
M 91.7 #加入-i选项Jim改为Tom直接写入文件
[root@localhost sh]# sed -i '4s/Jim/Tom/g' student.txt
[root@localhost sh]# cat student.txt
ID Name PHP Linux MySQL gender Average
LiNing M 87.7
HanMei F 85.3
Tom M 91.7
3. 字符处理命令
(1) sort排序命令
格式为:sort [选项] 文件名
其中-f选项表示忽略大小写;-n选项以数值型进行排序,默认使用字符串型排序;-r选项表示反向排序;-t选项表示指定分隔符,默认的分隔符为制表符;-k n[,m]选项表示按照指定的字段范围排序,从第n字段开始,m字段结束(默认到行尾)。
#排序用户信息文件
[root@localhost sh]# sort /etc/passwd
abrt:x::::/etc/abrt:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin
bin:x:::bin:/bin:/sbin/nologin
...... #反向排序
[root@localhost sh]# sort -r /etc/passwd
ws:x::::/home/ws:/bin/bash
vcsa:x:::virtual console memory owner:/dev:/sbin/nologin
uucp:x:::uucp:/var/spool/uucp:/sbin/nologin
...... #指定分隔符为":",且只使用第三字段排序(默认为zi)
[root@localhost sh]# sort -t ":" -k , /etc/passwd
root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
uucp:x:::uucp:/var/spool/uucp:/sbin/nologin
operator:x:::operator:/root:/sbin/nologin
...... #对第三序列进行数值排序
[root@localhost sh]# sort -n -t ":" -k , /etc/passwd
root:x:::root:/root:/bin/bash
bin:x:::bin:/bin:/sbin/nologin
daemon:x:::daemon:/sbin:/sbin/nologin
adm:x:::adm:/var/adm:/sbin/nologin
lp:x:::lp:/var/spool/lpd:/sbin/nologin
(2) 统计命令wc
格式为:wc [选项] 文件名
其中,-l选项表示只统计行数;-w选项表示只统计单词数;-m选项表示只统计字符数。
4. 条件判断式
(1) 按照文件类型进行判断
测试选项 | 作用 |
-b 文件 | 判断该文件是否存在,且是否为块设备文件 |
-c 文件 | 判断该文件是否存在,且是否为字符设备文件 |
-d 文件 | 判断该文件是否存在,并且是否为目录文件 |
-e 文件 | 判断该文件是否存在 |
-f 文件 | 判断该文件是否存在,且是否为普通文件 |
-L 文件 | 判断该文件是否存在,且是否为符号链接文件 |
-p 文件 | 判断该文件是否存在,且是否为管道符文件 |
-s 文件 | 判断该文件是否存在,并且是否为空 |
-S 文件 | 判断该文件是否存在,且是否为套接字文件 |
两种判断格式:
#①查看root下的install.log是否存在
[root@localhost ~]# test -e /root/install.log
#0表示存在
[root@localhost ~]# echo $? #②脚本当中常用的判断格式为中括号,同样执行上面的查询,注意中括号两端有空格
[root@localhost ~]# [ -e /root/install.log ] && echo $? #第一条命令执行正确,打印yes,否则打印no
[root@localhost ~]# [ -d /tmp/ ] && echo "yes" || echo "no"
yes
(2) 按照文件的权限进行判断
测试选项 | 作用 |
-r 文件 | 判断该文件是否存在,且是否拥有读权限 |
-w 文件 | 判断该文件是否存在,且是否拥有写权限 |
-x 文件 | 判断该文件是否存在,且是否拥有执行权限 |
-u 文件 | 判断该文件是否存在,且是否拥有SUID权限 |
-s 文件 | 判断该文件是否存在,且是否拥有SGID权限 |
-k 文件 | 判断该文件是否存在,且是否拥有SBit权限 |
#只要u、g、o中有一个拥有写权限,即返回yes
[root@localhost tmp]# [ -w sh/student.txt ] && echo yes || echo no
yes
(3) 两个文件之间进行比较
测试选项 | 作用 |
文件1 -nt 文件2 | 判断文件1的修改时间是否比文件2的新 |
文件1 -ot 文件2 | 判断文件1的修改时间是否比文件2的旧 |
文件1 -ef 文件2 | 判断文件1和文件2的Inode号是否一致,可理解为两文件是否为同一个文件(判断硬链接的好方法) |
[root@localhost sh]# pwd
/tmp/sh
#创建硬链接
[root@localhost sh]# ln student.txt ../student1.txt
#判断两文件是否为同一文件
[root@localhost sh]# [ student.txt -ef ../student1.txt ] && echo yes || echo no
yes
(4)两个整数之间的比较
测试选项 | 作用 |
整数1 -eq 整数2 | 判断整数1是否和整数2相等 |
整数1 -ne 整数2 | 判断整数1是否和整数2不相等 |
整数1 -gt 整数2 | 判断整数1是否大于整数2 |
整数1 -lt 整数2 | 判断整数1是否小于整数2 |
整数1 -ge 整数2 | 判断整数1是否大于等于整数2 |
整数1 -le 整数2 | 判断整数1是否小于等于整数2 |
[root@localhost sh]# [ -gt ] && echo yes || echo no
yes
[root@localhost sh]# [ -le ] && echo yes || echo no
no
(5) 字符串的判断
测试选项 | 作用 |
-z 字符串 | 判断字符串是否为空 |
-n 字符串 | 判断字符串是否为非空 |
字串1==字串2 | 判断字符串1是否和字符串2相等 |
字串1!=字串2 | 判断字符串1是否和字符串2不相等 |
[root@localhost sh]# name=ws
[root@localhost sh]# [ -z "$name" ] && echo yes || echo no
no [root@localhost sh]# name1=ws
[root@localhost sh]# [ "$name"=="$name1" ] && echo yes || echo no
yes
(6) 多重条件判断
测试选项 | 作用 |
判断1 -a 判断2 | 逻辑与,判断1和判断2都成立,最终的结果才为真 |
判断1 -o 判断2 | 逻辑或,判断1和判断2有一个成立,最终的结果即为真 |
! 判断 | 逻辑非,使原始的判断式取反 |
#判断变量aa是否有值,并且其值是否大于23
[root@localhost sh]# [ -n "$aa" -a "$aa" -gt ] && echo yes || echo no
no
Linux学习笔记(17) Shell编程之基础的更多相关文章
-
Linux学习笔记(18) Shell编程之流程控制
1. if语句 (1) 单分支if条件语句 格式为: # 注意条件判断式两端的空格if [ 条件判断式 ];then 程序员 fi 或者 if[ 条件判断式 ] then 程序 fi 例:判断分区使用 ...
-
Linux学习笔记:Shell脚本学习
概念 真正能够控制计算机硬件(CPU.内存.显示器等)的只有操作系统内核(Kernel),图形界面和命令行只是架设在用户和内核之间的一座桥梁. 由于安全.复杂.繁琐等原因,用户不能直接接触内核(也没有 ...
-
Linux学习笔记 -- 初识 Shell
Shell 是什么 Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁.Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务.Shell既是 ...
-
linux学习(七)Shell编程中的变量
目录 shell编程的建立 shell的hello world! Shell的环境变量 使用和设置环境变量 Shell的系统变量 用户自定义变量 @(Shell编程) shell编程的建立 [root ...
-
#Linux学习笔记# 自定义shell终端提示符
我使用的Linux发行版是LinuxMint 17.2 Rafaela,默认情况下Terminal中的shell提示包括了用户名.主机名.当前目录(绝对路径)和提示符.这样会导致当进入一个比较深的目录 ...
-
Linux学习笔记<;五>;——<;Shell部分>;
管道命令(pipe) 1.把一个命令的输出作为另一个命令的输入 ls -al /etc | less 2.选取命令:cut和grep cut命令可以将一段消息的某段切出来. -d接分隔符,-f是取出第 ...
-
linux学习笔记之shell
本文参考:shell脚本学习指南 本文阅读前提为:知道shell指令,但不知道如何完成一个自动化的shell脚本. 因为编辑本文时,作者也是一个新手.所以,在一些理论上,可能存在错误.如果存在错误,希 ...
-
Linux学习笔记 -- 为 Shell 传递参数
我们可以在执行 Shell 脚本时,可以向脚本传递参数.脚本内获取参数的格式为:$n.(n 代表一个数字,0为所执行的shell脚本名称,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类 ...
-
Linux学习笔记:shell
目录 通配符 特殊符号 变量 环境变量 默认变量 shell script case if for until while function 本文更新于2019-08-23. 通配符 *:0个至无穷多 ...
随机推荐
-
Apache2.4中开通HTTP基本认证
Apache2.4中开通HTTP基本认证,需要在Apache的配置文件中增加如下代码 WSGIPassAuthorization On 否则则无法认证
-
Codeforces Round 190 div.2 322C 321A Ciel and Robot
唔...这题是数学题. 比赛时做出来,但题意理解错了,以为只要判断那点是不是在线上就行了,发现过不了样例就没提交. 思路:记录每一步的偏移,假设那点是在路径上的某步,然后回推出那一个周期的第一步,判断 ...
-
【Java】详解Java解析XML的四种方法
XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML.本文将详细介绍用Java解析XML的四种方法. AD: XML现在已经成为一种通用的数据交换格式,它的平台无关性,语 ...
-
Qt下使用的静态链接库------ *.lib转化为mingw使用的.a格式的静态库
使用MinGW附带的工具reimp.exe,该工具一般在MinGW in目录下,其readme文档在MinGWdoc eimp目录下, 方法很简单,比如: C:CodeBlocksMinGWlibdx ...
-
AutoCompleteTextView 和 TextWatcher 详解
TextWatcher 监测Edittext内容的变化------------------------------------------------------------------------- ...
-
企业IT管理员IE11升级指南【14】—— IE11代理服务器配置
企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...
-
java遍历复杂json字符串获取想要的数据
https://blog.csdn.net/qq_34309663/article/details/80508125 java如何解析复杂的json数据关于json处理的包有好几个,比如jackson ...
-
mysql InnoDB锁等待的查看及分析
说明:前面已经了解了InnoDB关于在出现锁等待的时候,会根据参数innodb_lock_wait_timeout的配置,判断是否需要进行timeout的操作,本文档介绍在出现锁等待时候的查看及分析处 ...
-
TX2-入门坑点-Ubuntu16.04任务栏消失
问题:安装cuda过程中出现任务栏消失,快捷键失效的现象. 解决方法:重装桌面无法解决,使用cssm无法解决,最后删除home目录下的 .cache文件夹重启后解决
-
如何利用github打造个人博客专属域名(文字版本)
1. 前言 此篇文章仅限于记录,不适合作为教程使用. 2. 步骤 2.1 先决条件 有github账号,有个人域名(可在万网购买),电脑本地安装有git环境 2.2 在github新建仓库.例如我的g ...