本篇博客将介绍linux系统中比较常用的 bash 以及用法,例如被称为Linux系统中的"三剑客"--grep , sed , awk ; 还有cut ,seq , sort , wc , uniq , diff ,通配符等 .
在Linux系统中查找文件一般都会用到通配符 , 管道 , bash技巧命令来输出我们想要得到的结果 , 首先我们先了解通配符的作用:
一 . 通配符
作用 : 是用来在文件搜索时代替文件名中的一个或多个正真字符 .
常用通配符符号有 : ? * []
? 作用 : 匹配任意单个字符 .
例 : ls /dev/tty? , 输出的结果为 /dev/tty 加任意一个字符 , 如图 :
再尝试使用命令 ls /dev/tty?? , 结果为 :
* 作用 : 匹配任意0个或多个字符 , 意为所有
例 : ls /dev/tty*
同理 , ls /etc/*.conf , 输出的结果为显示目录 /etc 下的所有以conf结尾的文件 , 这里不做尝试 .
[] 作用 : 匹配[]中的任意单个字符
例 : ls /dev/tty[123]5
也可以连续一个范围进行匹配 , 如 ls /dev/tty[1-6]5
管道符| :将前一个命令的结果(标准输出) 传给后一个命令继续处理
例 : head -6 /etc/passwd | cat -n #查看文件/etc/passswd的前6行 后, 再用cat查看显示行号
说明 : 管道符可以一个接着一个 , 例在上面的例子上再输出前3行信息
二 . Linux系统三剑客其二(grep , sed )入门
awk用法见博客 :https://blog.51cto.com/14181896/2359808
1 . grep : 匹配关键字 , 显示文件中关键字所在的整行内容
例 : grep root /etc/passwd #显示/etc/passwd文件中所包含root关键字的行
常用选项 : -n 显示行号
-i 不区分大小写
-v 取反
-c 带关键字的函数
-n 静默执行 , 不在屏幕显示匹配到的内容 , 通常用于shell脚本
更多选项用法可以用 grep --help 查看用法
2 . sed流编辑器
是一种文本编辑器 , 默认情况下是不会修改原文件的 , 也是一种非交互式的编辑器
工作原理 : 一行一行处理文件 , 当从文件中读取一行后 , 首先放到模式空间(内存缓冲区)匹配关键字进行相应的处理 , 处理完将结果输出到屏幕上 , 接着处理下一行内容 , 直到所有行都读取完毕 , sed 结束 .
sed的语法 : sed [option] '地址命令' 文件名
常用选项 : -n 静默输出 , 关闭模式空间的输出 , 不会输出未匹配到的行
-e 允许进行多项编辑 , 应用于对同一行做多次处理 , -e "命令1" -e "命令2" ..-e "命令n"
-f 后接sed脚本 , 指定执行的sed脚本
-r 允许使用扩展正则
-i 直接作用于原文件
sed 地址定址 :
定址用于决定对哪些行进行编辑 , 地址形式可以是数字 , 正则表达式或二者结合 . 如果没有指定地址 , sed将处理输入文件中的所有行 .
例 : 文件准备 , 将/etc/passwd文件中的前10行内容添加行号覆盖写入/pass文件中 , 然后查看/pass文件中的内容
输出单行 :
sed -n '1p' /pass #显示/pass文件中的第一行 ,1p 指print 第1行
同理 , 输出/pass文件第5行 :
输出指定的多行 :
指定行数 , 行数号与行数号之间用逗号隔开
打印从i行开始的后几行 (i,+n)
打印从第1行开始 , 再加上n行为止
关键字匹配: 处理符合模式(匹配关键字)的行 , -r 表示启用正则表达式
例 : 显示/etc/passwd文件中以root开头的内容
sed的子命令 :
sed的子命令告诉sed对指定行进行何种操作 , 包括打印p , 删除d , 修改(追加a , 插入i , 替换s , 字符替换c)
将/etc/passwd这个文件前10行导入新文件/pass1: head /etc/passwd > /pass1
d : 删除(delete)
sed '/^root/d' /pass1 处理/pass1文件显示删除以root开头的行号
i : (i\text) 在符合模式的行的上面插入(insert)\以后的text文本 , 结果将在终端上显示 , 默认不会改变原文件
sed '/^root/i\hello' /pass1
a : (a\text) 在符合模式的行的下面追加\以后的text文本 , 处理结果同 i
结合上面两个例子 , 使用 -e 选项 同时执行 , 结果如图所示 :
c : (c\text) 用新文本覆盖符合模式的行中的文本
例 : 用 hello world 覆盖/pass1文件中的第 2 行
s : 用一个字符替换另一个字符
例 : sed 's/root/ROOT/g' /pass1 #指定替换所有匹配到的
sed 's/root/ROOT/2' /pass1 #指定替换匹配到的的第二个
cut命令 : 提取文件中指定的字段 , 字符内容 . 默认分隔符为空格
格式 : cut [选项].. [文件]..
常用选项 : -b 按照字节切 , utf-8编码中每个汉字占三个字节(好比4个汉字就取得12个字节)
-c 按照字符切
-d 指定分隔符
-f 指定以分隔符分割的哪个字段
实例 : 将 /etc/passwd 文件中的前5行覆盖写入/pass 文件中( head -5 /etc/passwd > /pass)
显示/pass文件中以 : 分隔的第6行内容 , 家目录内容:
显示/pass文件中的第一列(用户名)和第7列(shell解释器)的内容:
同理 : cut -d : -f 1-3 /pass 取1~3列内容
以字符大小切 , 例 :echo '×××' | cut -b 1-12
seq : 按顺序打印出一些数字 , 例如: 1 2 3 4 5 ...
用法 : seq [选项] ...尾数
seq [选项] ... 首数 尾数
seq [选项] ...首数 增量 尾数
实例 : seq 5 #按顺序输出1~5的数
同理 : seq 5~10 #按顺序输出5~10的数
seq 1 2 10 #输出1~10之间的奇数
seq 10 -1 0 #输入10~0之间的数
补齐输出 : -w 例 : seq -w 1 50 200
扩 : 使用echo命令也能实现seq同样的效果 , 格式 echo {首数..尾数..增量}
sort排序 : 排序分为升序 和 降序 , 默认是按升序进行排列
常见选项 : -n(--numeric--sort) 根据数值比较 , 默认是按单个字符来比较
-r 逆序输出排序结果
-t 指定分割符
-k 排序键(key , 即排序的列字段)
-u 去掉重复行
实例 : seq 1 10 | sort
seq 1 10 | sort -n
seq 1 10 | sort - nr
sort -t : -k 2 -n 文件名 #按 : 分割开的以第2列是数值大小排序 (使用的最多)
例 : 按/etc/passwd 文件中第3列uid数值大小进行排列
wc : 统计行数 , 单词数 , 字节数
例 : wc /etc/passwd #在/etc/passwd这个文件中有45行 , 92个单词数 , 2356个字节
wc -l 统计行数
wc -c 统计字节数
wc -m 统计单词数
统计 /bin 目录下有多少个命令
uniq : 合并连续重复的行
常用选项 : -u 只显示没有连续重复的行
-c 统计连续重复行的次数
-d 只显示连续重复行一次 , 哪一行连续重复了就显示哪行
-i 忽略大小写
例 : 准备一个文件 a.txt , 在文件输入内容并查看a.txt如图所示 :
uniq -c a.txt #统计连续出现的次数
uniq a.txt #对a.txt 文件中连续重复的行只显示一次
uniq -u a.txt #不显示连续重复的行
uniq -d a.txt #仅显示连续出现的内容一次
结合sort排序使用 , 显示没有重复的行
diff 命令 :
vimdiff : 比较两个文件的差异
实例 : 准备两个存在差异的文件 :
head -3 /etc/passwd > /tmp/pass3
head -5 /etc/passswd > /tmp/pass5
准备好上面两个文件之后 ,先使用vimdiff 对比/pass3 和 /pass5的文件内容 , 再用diff命令对比两个文件的差异 , 将显示出两个文件不同内容:
通过显示差异 , 可以制作补丁 :
diff /pass3 /pass5 > /pass35.patch #制作补丁文件/pass35.patch(增加内容) 并查看此文件 :
diff /pass5 /pass3 > /pass53.pattch #制作补丁文件/pass53.patch(减少内容)
patch 打补丁 :
首先安装patch -- yum install -y patch ,然后给/pass3 文件打补丁 , 最后查看/pass3文件内容 :
同理 patch /pass3 /pass53.patch 会减少/pass3的最后两行
tr : 替换字符 , 被替换的字符与替换的字符数必须是相等的
用法 : tr 旧字符 新字符
实例 : 准备一个文件 b.txt , 内容如图 :
cat b.txt | tr 20 89 #将cat b.txt 结果中的20 替换成了 89(不改变原文件)
cat a.txt | tr "a-z" "A-Z" #替换时一一替换 , 字母变成大写
以上都是比较常见的 bash 和 它们的用法 , 下一篇再介绍 awk 的简介作用以及它的入门操作