grep
grep [-acinv] [--color=auto] '搜寻字符串' filename
-a: 将 binary 文件以 text 文件方式搜寻数据
-c: 计算找到 '搜寻字符串' 的数据
-i: 忽略大小写的不同,所以大小写视为相同
-o : only,只显示匹配的内容,其他不作输出
-n: 顺便输出行号
-v: 反向选择,亦即显示出没有 '搜寻字符串' 的那一行
--color=auto: 将查找到的 '搜寻字符串' 加上颜色,高亮显示
grep nginx /etc/passwd
参考文档
shell grep 的结果只取第一行
Linux下使用grep,tail 查看查找日志
linux 下利用ls grep 和正则表达式实现目录和文件的分开显示
grep 文本过滤
《鸟哥的Linux私房菜-基础学习篇 第四版》 10.6.1 撷取命令: cut, grep
《鸟哥的Linux私房菜-基础学习篇 第四版》 11.2.2 grep 的一些进阶选项
awk
awk——按列处理数据
- -F :分隔符
awk 通常运作的模式是这样的:
awk '条件类型 1{动作 1} 条件类型 2{动作 2} ...' filename
awk 后面接两个单引号并加上大括号 {} 来设定想要对数据进行的处理动作。 awk 可以处理后续接的文件,也可以读取来自前个指令的 standard output 。 但如前面说的, awk 主要是处理『每一行的字段内的数据』,而默认的『字段的分隔符为 “空格键” 或 “[tab]键” 』 !
在 awk 的括号内, 每一行的每个字段都是有变量名称的,那就是 $1, $2… 等变量名称。以上面的例子来说, dmtsai 是 $1 ,因为他是第一栏嘛!至于 192.168.1.100是第三栏, 所以他就是 $3 啦!后面以此类推~呵呵!还有个变数喔!那就是 $0 , $0 代表『一整列资料』的意思~以上面的例子来说,第一行的 $0 代表的就是『 dmtsai … 』那一行啊!
# last -n 5: 使用last指令取出登录用户,只取前5行
# awk '{print $1 "\t" $3}': 以空格(默认)为分隔符,打印(print)出第一列($1)和第三列($3)的数据,
# 并以"\t"为分隔符进行显示
last -n 5 | awk '{print $1 "\t" $3}'
awk 是『 以行为一次处理的单位』, 而『 以字段为最小的处理单位』。
变量名称 | 代表意义 |
---|---|
NF | Num Field,每一行 ( 0 ) 拥 有 的 字 段 总 数 ; N F 表 示 字 段 总 数 , 0) 拥有的字段总数;NF表示字段总数, 0)拥有的字段总数;NF表示字段总数,NF表示最后一个字段,$(NF-1)表示倒数第二个字段 |
NR | Num Row,目前 awk 所处理的是『第几行』数据 |
FS | Field Split,字段分隔符,默认是空格或制表符,也可使用-F参数指定 |
RS | Row Split,行分隔符,用于分割每一行,默认是换行符。 |
OFS | Output Field Split,输出字段的分隔符,用于打印时分隔字段,默认为空格 |
ORS | Output Row Split,输出记录的分隔符,用于打印时分隔记录,默认为换行符。 |
OFMT | 数字输出的格式,默认为%.6g |
# last -n 5: 使用last指令取出登录用户,只取前5行
# awk '{print $1 "\t lines: " NR "\t columns: " NF}': 以空格(默认)为分隔符,拆分前面命令的输出,
# 并以\t为分隔符,打印出对应变量的数据
# 并以"\t"为分隔符进行显示
last -n 5| awk '{print $1 "\t lines: " NR "\t columns: " NF}'
awk 的逻辑运算字符
运算单元 | 代表意义 |
---|---|
> | 大于 |
< | 小于 |
== | 等于 |
>= | 大于等于 |
<= | 小于等于 |
!= | 不等于 |
# {FS=":"}, 以:为分隔符进行分割,从第二行开始生效
cat /etc/passwd | awk '{FS=":"} $3 < 10 {print $1 "\t " $3}'
# BEGIN {FS=":"}, 以:为分隔符进行分割,从第一行开始生效,BEGIN表示预设变量
cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}'
函数(后面自己补充)
条件(后面自己补充)
if语句
awk提供了if结构,用于编写复杂的条件。
# 以":"为分隔符,查找demo.txt(/etc/passwd文件的备份)文件中第一列大于m的字段并输出
awk -F ':' '{if ($1 > "m") print $1}' demo.txt
if结构还可以指定else部分。
awk -F ':' '{if ($1 > "m") print $1; else print "---"}' demo.txt
参考文档
Linux三剑客之awk命令
awk 入门教程
AWK程序设计语言
sed
sed [-nefr] [动作]
选项与参数:
- -n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到屏幕上。但如果加上 -n 参数后, 则只有经过 sed 特殊处理的那一行(或者动作)才会被列出来。
- -e :直接在指令列模式上进行 sed 的动作编辑;
- -f :直接将 sed 的动作写在一个文件内, -f filename 则可以执行 filename 内的 sed 动作;
- -r : sed 的动作支持的是延伸型正规表示法的语法。 (预设是基础正规表示法语法)
- -i :直接修改读取的文件内容,而不是由屏幕输出。
动作说明: [n1[,n2]]function
- n1, n2 :不见得会存在,一般代表『 选择进行动作的行数』, 举例来说,如果我的动作是需要在 10 到 20 行之间进行的,
则『10,20[动作行为] 』
function 有底下这些咚咚:
- a :新增, a 的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行)~
- c :取代, c 的后面可以接字符串,
- 这些字符串可以取代 n1,n2 之间的行!
- d : 删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
- i :插入, i的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行);
- p :打印,即将某个选择的数据打印。通常 p 会与参数 sed -n
一起运行
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法! 例如 1,20s/old/new/g 就是啦!
以行为单位的新增/删除功能(后续补充)
以行为单位的取代与显示功能
nl /etc/passwd | sed '2,5c No 2-5 number' # 取代 nl /etc/passwd 命令输出结果的 2-5 行为 'No 2-5 number'
nl /etc/passwd | sed '5,7p' # 打印 nl /etc/passwd 命令的输出,其中 5-7 的内容会重复输出
nl /etc/passwd | sed -n '5,7p' # 使用安静模式打印 nl /etc/passwd 命令的输出,仅打印 5-7 行的内容
部分数据的搜寻并取代的功能
sed ‘s/要被取代的字符串/新的字符串/g’——sed工具替换的标准格式
# 替换 ifconfig wlp2s0 | grep 'netmask' 命令的输出结果中 'inet ' 部分内容为 ''
# 其中 '^.*inet '为进行匹配的正则表达式
ifconfig wlp2s0 | grep 'netmask' | sed 's/^.*inet //g'
# 替换 ifconfig wlp2s0 | grep 'netmask' 命令的输出结果中 'inet ' 部分内容为 '',
# ' netmask 255.255.255.0 broadcast 192.168.0.255' 部分内容为'',
# 其中 '^.*inet ', ' *netmask.*$'为进行匹配的正则表达式
ifconfig wlp2s0 | grep 'netmask' | sed 's/^.*inet //g' | sed 's/ *netmask.*$//g'