Shell常用命令与正则表达式

常用命令

sort命令

  • 以行为单位对文件中的行内容进行排序,也可以根据不同的数据类型来排序(字母、数值等),比较原则是从首字符向后,依次按ASCII码值进行比较,最后将它们按升序输出

语法格式

sort [选项] 参数
cat file | sort 选项
常用选项 介绍
-f 忽略大小写,会将小写字母都转换为大写字母来进行比较
-b 忽略每行前面的空格
-n 按照数字进行排序
-r 反向排序
-u 等同于uniq,表示相同的数据仅显示一行
-t 指定字段分隔符,默认使用[Tab]键分隔
-k 指定排序字段
-o <输出文件>:将排序后的结果转存至指定文件
示例:
sort -n testfile1#按照数字进行排序
sort -t ':' -k 3 -n /etc/passwd#将/etc/passwd中的指定字段以:为分隔符,按照数字进行排序
du -a | sort -nr -o du.txt#将当前家目录中的所有文件进行排序,查出占用空间最大的文件并保存

uniq命令

  • 用于报告或者忽略文件中连续的重复行,常与sort命令结合使用

语法格式

uniq [选项] 参数
cat file | uniq 选项
常用选项 介绍
-c 进行计数统计,并删除文件中重复出现的行(去重)
-d 仅显示连续的重复行
-u 仅显示出一次的行
示例:
uniq testile2#用于报告或者忽略文件中连续的重复行
sort -n testfile2 | uniq -c#对文件的内容进行排序并且进行统计
grep "Failed password"/var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr
#显示登录试错的次数最多的主机IP
cat testfile2 | sort -n | uniq -u#显示此文件中没有重复行的内容

tr命令

  • 常用来对来自标准输入的字符进行替换、压缩和删除

语法格式

tr [选项] [参数]
常用选项 介绍
-c 保留字符集1的字符,其他的字符(包括换行符\n)用字符集2替换
-d 删除所有属于字符集1的字符
-s 将重复出现的字符串压缩为一个字符串;用字符集2 替换 字符集1
-t 字符集2 替换 字符集1,不加选项同结果

参数

字符集1:指定要转换或删除的原字符集。当执行转换操作时,必须使用参数"字符集2"指定转换的目标字符集。但执行删除操作时,不需要参数"字符集2"

字符集2:指定要转换成的目标字符集

示例:
echo abc | tr 'a-z' 'A-Z'#将此小写转换成大写
echo abc | tr 'b' 'B'#仅将小写b转换成大写B
①对字符串进行替换:
[root@localhost ~]# echo -e "abc\ncabcdab"
abc
cabcdab
[root@localhost ~]#echo -e "abc\ncabcdab" | tr -c "ab\n" "0"
ab0
0ab00ab
②对字符串进行拼接:
[root@localhost ~]# echo "hello world"
hello world
[root@localhost ~]# echo "hello world" | tr -d 'od'
hell wrl
[root@localhost ~]# echo "hello world" | tr -d 'od '
hellwrl
③对字符串进行压缩:
[root@localhost ~]# echo "thisssssss is a test linnnnnnnne." | tr -s 'sn'
this is a test line.
④对可执行文件中的":"进行替换并且换行:
[root@localhost ~]# echo $PATH | tr -s ":" "\n"
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/root/bin
⑤删除Windows文件造成的'^M'字符:
Linux中遇到换行符("\n")会进行回车+换行的操作,回车符反而只会作为控制字符("^M")显示,不发生回车的操作。而windows中要回车符+换行符("\r\n")才会回车+换行,缺少一个控制符或者顺序不对都不能正确的另起一行。
cat abc.txt | tr -s "\r" "\n" > new_file
或
cat abc.txt | tr -d "\r" > new_file
或
通过使用dos2unix服务进行修改
--------------------
⑥用代码对数组进行排序:
[root@localhost ~]# array=(63 15 1 4 24 30)
[root@localhost ~]# echo ${array[*]}
63 15 1 4 24 30
[root@localhost ~]# a=$(echo ${array[*]} | tr -t " " "\n" | sort -n)
[root@localhost ~]# i=0
[root@localhost ~]# for num in $(echo $a)
> do
> arr[$i]=$num
> let i++
> done
[root@localhost ~]# echo ${arr[@]}
1 4 15 24 30 63
或
[root@localhost ~]# echo ${arr[@]}
1 4 15 24 30 63
[root@localhost ~]# for num in $(echo $a)
> do
> arr3+=($num)
> done
[root@localhost ~]# echo ${arr[@]}
1 4 15 24 30 63

cut命令

  • 显示行中指定的部分,删除文件中指定的字段(截取字段字符串)

语法格式

cut 参数
cat file | cut 选项
常用选项 介绍
-f 通过指定哪一个字符进行提取,cut命令使用"TAB"作为默认的字段分隔符
-d "TAB"是默认的分隔符,使用此选项可以更改为其他的分隔符
-b 以字节为单位进行分割
--complement 此选项用于排除所指定的字段
--output-delimiter 更改输出内容的分隔符
示例:
cut -d ':' -f 1 /etc/passwd
grep '/bin/bash' /etc/passwd | cut -d ':' -f 1-4,6,7
#截取/ect/passwd中以带有/bin/bash字段的行以-分隔的开始字段和结束字段指定字段的范围
grep '/bin/bash' /etc/passwd | cut -d ':' --complement -f 2#排除第二个字段
cut -d ':' -f1,7 --output-delimiter=' ' /etc/ passwd#输出分隔符使用空格分隔
字符串的分片的方法
[root@localhost ~]# i=123456789
方法一:
[root@localhost ~]# echo ${i:3:3}#{变量:索引下标:截取长度};索引位置从0开始
456
方法二:
[root@localhost ~]# echo $i | cut -b 4-6#;索引位置从1开始的
456
方法二:
[root@localhost ~]# expr substr $i 4 3#索引位置从1开始
456

split命令

  • Linux下将一个大的文件拆分成若干小文件

语法格式

split 选项 参数 原始文件 拆分后文件名前缀
常用选项 介绍
-l 以行数拆分
-b 以大小拆分
split -l 20 /etc/passwd passwd
#以20行对文件进行拆分,最后一个文件的行数没有20行以实际行数进行分配

sprlit拆分.png


eval命令

  • 用于重新运算求出参数的内容
  • eval可读取一连串的参数,然后再依参数本身的特性来执行。
  • 命令字前加上eval时,shell会在执行命令之前扫描它两次。
  • eval命令将首先会先扫描命令行进行所有的置换,然后再执行该命令。
  • 该命令适用于那些一次扫描无法实现其功能的变量。

语法格式

eval [参数]

参数

参数不限数目,彼此之间用分号分开

#eval会对变量扫描两次,先对相关的变量先进行置换,然后再执行命令
示例1:
[root@localhost ~]# myfile="cat file"         #定义变量
[root@localhost ~]# echo $myfile              #输出变量
cat file                                      #此时的结果
[root@localhost ~]# echo "hello world" > file #把"hello world"重定向到file文件中
[root@localhost ~]# cat file                  #查看file文件
hello world
[root@localhost ~]# echo $myfile              #输出变量
cat file
[root@localhost ~]# eval $myfile              #eval命令对变量进行两次扫描
hello world                                   #此时的结果
示例2:
[root@localhost ~]# cat eval.sh
#!/bin/bash
eval echo \$$#
[root@localhost ~]# bash eval.sh 0 1 2 3 4
4
示例3:
[root@localhost ~]# a=100
[root@localhost ~]# b=a
[root@localhost ~]# eval echo \$$b
100
[root@localhost ~]# eval $b=50
[root@localhost ~]# echo $a
50

正则表达式

  • 通常用于判断语句中,用来检查某一个字符串是否满足某一格式

  • 正则表达式是由普通字符与元字符组成;普通字符包括大小写字母、数字、标点符号及一些其他符号

  • 元字符是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符或表达式)在目标对象中的出现模式

基础正则表达式常见的元字符

(支持的工具:==grep、egrep、sed、awk==)

常用转义符 介绍 示例
\ 转义字符,用于取消特殊符号的含义 \ !、\n、$等
^ 匹配字符串开始的位置 ^ a、^ the、^ #、^ [a-z]
$ 匹配字符串结束的位置 word$、匹配空行
. 匹配除\n之外的任意的一个字符 go.d、g..d
* 匹配前面子表达式0次或者多次, goo*d、go.*d、^go.*d$
[list]:匹配list列表中的一个字符
例:go[ola]d,[abc]、[a-z]、[a-z0-9]、[0-9]匹配任意一位数字

[^list]:匹配任意非list列表中的一个字符
例:[^0-9]、[^A-Z0-9]、[^a-z]匹配任意一位非小写字母

\{n\}:匹配前面的子表达式n次
例:go\{2\}d、'[0-9]\{2\}'匹配两位数字

\{n,\}:匹配前面的子表达式不少于n次
例:go\{2,\}d、'[0-9]\{2,\}'匹配两位及两位以上数字

\{n,m\}:匹配前面的子表达式n到m次,m必须大于等于n
例:go\{2,3\}d、'[0-9]\{2,3\}'匹配两位到三位数字

注:egrep、awk使用{n}、{n,}、{n,m}匹配时"{}"前不用加"\"

扩展正则表达式元字符

(支持工具:==egrep、awk==)

:如果grep与sed想实现扩展正则表达的效果grep -E(等于egrep的作用)、sed -r

常用转义符 介绍 示例
+ 匹配前面子表达式1次以上 go+d, 将匹配至少一个o, 如god、 good、 goood等
匹配前面子表达式0次或者1次,要么有要么没有 go?d, 将匹配gd或god
() 将括号中的字符串作为一个整体 g(oo)+d, 将匹配oo整体1次以上,如good、gooood等
| 以或的方式匹配字条串 g(oo|la)d,将匹配good或者glad

正则表达式.png

结合实例
示例1:
[root@localhost data]# cat num.sh
#!/bin/bash
02588888888
025-5555555555
025 12345678
025 54321678
025ABC88888
02567 85519211
025-85519211
00025-85519211
#南京区号 025
#电话号码8位数 5或者8开头的
#区号号码
#区号 号码
#区号-号码
[root@localhost data]# egrep "^(025)[ \-]?(5|8)[0-9]{7}$" num.sh
02588888888
025 54321678
025-85519211
示例2:
[root@localhost data]# cat mail.sh 
#!/bin/bash
#电子邮箱
#用户名@子域名.[二级域名].顶级域
zangsan123@qq.com
li_si@163.com
wang@wu@sina.com
zhao liu@126.com
qianqi@sina.com.cn
#用户名@:长度要求在6-18位,大小写英文,任意数字,除了@符号和空格以外的其他任意符号字符,开头只能是 _或者字母
#子域名.[二级域名]:长度任意,符号只能包含 - _ .
#.顶级域名:长度在2-5,任意大小写英文
[root@localhost data]# egrep "^([a-zA-Z_][^ \@]{5,17})@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$" mail.sh 
zangsan123@qq.com
qianqi@sina.com.cn