Linux笔记—Shell编程

基础正则表达式

正则表达式和通配符的区别(Shell中)

  • 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配,grep、awk、sed等命令可以支持正则表达式
  • 通配符用来匹配符合条件的文件名,通配符是完全匹配。ls、find、cp这些命令不支持正则表达式,所以只能用shell自己的通配符来进行匹配了b

基础正则表达式

元字符 作用
* 前一个字符匹配0次或任意多次
. 匹配除了换行符外任意一个字符
^ 匹配行首
$ 匹配行尾
[] 匹配中括号中指定的任意一个字符,只匹配一个字符
[^] 匹配除中括号以外的任意一个字符
\ 转义符。用于取消特殊符号的含义
\ { n\ } 表示其前面的字符出现不小于n次
\ {n, \ } 表示其前面的字符出现不小于n次
\ {n, m\ } 表示其前面的字符至少出现n次,最多出现m次
  • grep “a*” test_rule.txt #匹配所有内容,包括空白行
  • grep “aa*” test_rule.txt #匹配一个至少包含有一个a的行
  • grep “aaa*” test_rule.txt # 匹配最少包含两个连续a的字符串

字符截取命令

cut字段提取指定列 cut [选项] 文件名

  • -f 列号 - 提取第几列
  • -d 分割符 - 按照指定分隔符分割列,默认使用制表符
  • 文件事先默认需要用tab制表符分隔,不能用空格分隔
  • cut -f 2 student.txt
  • cut -f 2,3 student.txt # 提取第2和第3列
  • cut -d “:” - f 1,3 student.txt # 指定分隔符为":"

printf格式化打印命令 printf ‘输出类型输出格式’ 输出内容

  • %ns - 输出字符串。n是数字指代输出几个字符
  • %ni - 输出整数。n是数字指代输出几个数字
  • %m.nf - 输出浮点数。m和n是数字,指代输出的整数位数和小数位数。如%8.2f代表共输出8位数,其中2位是小数,6位是整数
  • printf ‘%s %s %s\n’ 1 2 3 4 5 6
  • printf ‘%s\t %s\t %s\t %s\t %s\t %s\t \n’ $(cat student.txt) # 调整格式输出

awk列截取命令 awk '条件1{动作1} 条件2{动作2}… ’ 文件名

条件:一般使用变量关系表达式作为条件

  • x > 10 - 判断变量x是否大于10
  • x >= 10 - 大于等于
  • x <= 10 - 小于等于
  • BEGIN - 在所有动作之前进行相关操作

动作

  • 格式化输出
  • 流程控制语句

示例

  • awk ‘{printf $2 “\t” $6"\n"}’ student.txt # 输出第二列和第六列内容,用制表符分隔
  • $0代表整行本身
  • 可以与管道符结合使用,如df - h | awk ‘print $1 “\t” $3’ # print自动输出换行符,只能在awk命令中使用
  • cat student.txt | grep -v Name | awk ‘$6 >= 87 {printf $2 “\n”}’

sed命令 sed [选项] ‘[动作]’ 文件名

  • sed是一种几乎包括在所有UNIX平台的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令
  • vi只能修改文件,不能直接修改命令的结果;sed可以从管道符接收数据,而不用先写到文件中

选项

  • -n - 一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕
  • -e - 允许对输入数据应用多条sed命令编辑
  • -i - 用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出

动作

动作 作用
a \ 追加,在当前行后添加一行或多行。添加多行时,除最后一行外,每行末尾需要用" \ "代表数据未完结
c \ 行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需用" \ "代表数据未完结
i \ 插入,在当前行前插入一行或多行,插入多行时,除最后一行外,每行末尾需要用" \ "代表数据未完结
d 删除。删除指定的行
p 打印。输出指定的行
s 字串替换。用一个字符串替换另外一个字符串。格式为"行范围s/旧字串/新字串/g"

示例

  • sed -n ‘2p’ student.txt # 查看文件的第二行
  • sed ‘2,4d’ student.txt # 删除第二行到第四行的数据,但不修改文件本身
  • sed ‘2a hello’ student.txt # 在第二行后追加hello
  • sed ‘2i hello \ world’ student.txt # 在第二行前插入两行数据,其中第一行是’hello’,第二行是’world’

字符处理命令

sort排序命令 sort [选项] 文件名

  • -f - 忽略大小写
  • -n - 以数值型进行排序,默认使用字符串型排序
  • -r - 反向排序
  • -t - 指定分隔符,默认分隔符是制表符
  • -k n[, m] - 按照指定的字段范围排序。从第n字段开始,m字段结束(默认到行尾)
  • sort /etc/passwd

wc统计命令 wc [选项] 文件名

  • -l - 只统计行数
  • -w - 只统计单词数
  • -m - 只统计字符数

条件判断(用于计算机判断)

按照文件类型进行判断(具体见参考书)

常用类型

测试选项 作用
-d 文件 判断该文件是否存在,并且是否为目录文件(是目录为真)
-e 文件 判断该文件是否存在(存在为真)
-f 文件 判断该文件是否存在,并且是否为普通文件(是普通文件为真)

两种判断格式

  1. test -e /root/install.log
  2. [ -e /root/install.log ](注意有空格)

示例

  • [-d/root] && echo “yes” || echo “no” # 第一个判断命令如果正确执行,则打印”yes", 否则打印"no"

两个文件之间进行比较

测试选项 作用
文件1 -nt 文件2 判断文件1的修改时间是否比文件2的新(如果新则为真)
文件1 -ot 文件2 判断文件1的修改时间是否比文件2的旧(如果旧则为真)
文件1 -ef 文件2 判断文件1是否和文件2的Inode号一致,两个文件是否为同一个文件。可以用来判断是否为硬链接

两个整数之间比较

测试选项 作用
整数1 -eq 整数2 判断整数1是否和整数2相等(相等为真)
-ne 不相等
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于

两个字符串的判断

测试选项 作用
-z 字符串 判断字符串是否为空
-n 字符串 判断字符串是否为非空
字串1 == 字串2 判断字串1和字串2是否相等
字串1 != 字串2 判断字串1和字串2是否不等

示例

  • [ “$aa” == “bb” ] && echo “yes” || echo “no” # 判断两个变量的值是否相等

多重条件判断(与或非)

测试选项 作用
判断1 -a 判断2 逻辑与
判断1 -o 判断2 逻辑或
!判断 逻辑非

流程控制

if语句

if [ 条件判断式 ];then	#注意条件判断式有空格
	程序
else
	程序
fi
#或者
if [ 条件判断式 ];
	then
		程序
else
		程序
fi

case语句

for语句

while语句

发布了77 篇原创文章 · 获赞 7 · 访问量 4807

猜你喜欢

转载自blog.csdn.net/Felix_hyfy/article/details/104443365