shell三剑客

一、grep

grep是文本搜索工具,用来过滤制定规则的信息。

2种用法:

grep [OPTION...] PATTERNS [FILE...]
some commands | grep [OPTION...] PATTERNS

选项:

匹配器选项:
-E, --extended-regexp 扩展正则
-F, --fixed-strings 固定字符串,不是正则
-G, --basic-regexp 基础正则,默认选项
-P, --perl-regexp perl 兼容的正则

示例:

# 使用 | 来分割多个pattern,以此实现OR操作
# 查看包含root或者daemon的行内容
grep -E 'root|daemon' /etc/passwd

# 查看包含daemon和nologin的行内容
grep -E 'daemon.*nologin' /etc/passwd

# 因为[]通常用在正则表达式中,所以以下命令执行时会报错,因为[]会被识别为正则表达式,所以此时需加上—F来把[]当成普通的字符床
grep  '[LoanGrantPO(bussNos=[NJZL-HZ-202104-9854]' /etc/passwd   # 会报错grep: Invalid range end
grep  -F '[LoanGrantPO(bussNos=[NJZL-HZ-202104-9854]' /etc/passwd

匹配控制选项:
-e PATTERNS, -regexp=PATTERNS 指定正则风格
-f FILE, --file=FILE 从 FILE 指定正则风格
-i, --ignore-case 忽略大小写
-v, --invert-match 反向匹配
-w, --word-regexp 字符串精确匹配
-x, --line-regexp 整行匹配
-y -i 的过时同义词。

示例:

# -e只能传递一个参数,所以使用多个-e 等同于-E
grep -e root -e daemon /etc/passwd
grep -E 'root|daemon' /etc/passwd # 等价上面表达式

# 查看带有user(忽略大小写)的内容
grep -i user /etc/passwd

# 查看不带root的内容,-v等同于NOT操作
grep -v "root" /etc/passwd

# 只匹配Management,如有Managements不能被匹配出来,-w 精确匹配
grep -w "Management" /etc/passwd

输出控制选项:
-c, --count 打印匹配行的个数
–color[=WHEN], --colour[=WHEN] 设置显示颜色
-L, --files-without-match 打印不匹配的文件名,在第一次匹配时停止扫描
-l, --files-with-matches 打印匹配的文件名,在第一次匹配时停止扫描
-m NUM, --max-count=NUM 结束读取前最多匹配的行数
-o, --only-matching 只打印匹配的部分
-q, --quiet, --silent 不输出内容
-s, --no-messages 不打印错误信息

示例:

# -c打印个数,精确匹配带有Management的行的个数
grep -w "Management" -c /etc/passwd

输出行前缀控制选项:
-b, --byte-offset 打印文件中从 0 开始的字节偏移量
-H, --with-filename 打印文件名
-h, --no-filename 不打印文件名
–label=LABEL 将实际来自标准输入的输入显示为来自文件 LABEL 的输入
-n, --line-number 打印行号
-T, --initial-tab 确保实际行内容的第一个字符位于制表位上
-u, --unix-byte-offsets 报告 Unix 风格的字节偏移
-Z, --null 在每个文件名后边打印一个空字符

示例:

# 匹配带有root的行,并显示行号
grep -n root /etc/passwd

上下文行控制选项:
-A NUM, --after-context=NUM 打印匹配行加上后边 NUM 行
-B NUM, --before-context=NUM 打印匹配行前边 NUM 行加上匹配行
-C NUM, -NUM, --context=NUM 打印输出的上下 NUM 行
–group-separator=SEP 使用 SEP 作为组分隔符,默认是 “–”
–no-group-separator 组分隔符为空

示例:

# 匹配带有root的行及后面5行内容,-B是前面,-C是包含前后,用法都一样
 grep -A 5 'root' /etc/passwd

文件和目录选择选项:
-a, --text 把二进制文件当作文本文件
–binary-files=TYPE 把二进制文件当作 TYPE 类型文件
-D ACTION, --devices=ACTION 使用 ACTION 操作设备、管道、套接字
-d ACTION, --directories=ACTION 使用 ACTION 操作目录
–exclude=GLOB 不匹配 GLOB 通配符描述的文件名
–exclude-from=FILE 不匹配 FILE 中的通配符格式
–exclude-dir=GLOB 不匹配 GLOB 通配符描述的目录
-I(大写的i) 处理二进制文件,就好像它不包含匹配数据一样
–include=GLOB 只匹配 GLOB 通配符描述的文件名
-r, --recursive 递归搜索,不跟随软链
-R, --dereference-recursive 递归搜索,跟随软链

其他选项:
–line-buffered 使用行缓冲区
-U, --binary 把文件当作二进制文件
-z, --null-data 把文件的行末视作以空字符结尾

二、sed

文件解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除、替换等)

常见用法:

sed  [选项]   '操作'   参数
sed  [选项]  -f scriptfile 参数

常用选项:
-n :不输出模式空间内容到屏幕,即不自动打印
-e :多点编辑
-f FILE :从指定文件中读取编辑脚本
-r, -E: 使用扩展正则表达式
-i.bak: 备份文件并原处编辑
-s:将多个文件视为独立文件,而不是单个连续的长文件流

操作:
a:增加,在当前行下面增加一行指定内容。
c:替换,讲选定行替换为指定内容。
d:删除,删除选定的行。
i:插入,在选定行上面插入一行指定内容。
p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容,如果又非打印字符,则以ASCLL码输出。通常与“-n”选项一起使用。
s:替换,替换指定字符
y:字符转换

示例:

# 输出全部内容,p是操作符号,表示打印
sed -n 'p' /etc/passwd  
# 输出含root的内容
sed -n '/root/p' /etc/passwd  
# 输出2-4行内容
sed -n '2,4p' /etc/passwd 
# 输出以#开头的内容
sed -n '/^#/p' /etc/inittab  
# 输出以数字结尾的内容
sed -n '/[0-9]$/p' 1.txt  


# 在含有the的行的下一行添加我是谁
sed '/the/a 我是谁' test.txt  #在含有the的行的下一行添加我谁


# 删除第三行内容 d是操作符号,表示删除
cat 1.txt |sed '3d'


# 将每行中的第一个2替换为9
sed 's/2/9/' 1.txt 
# 将每行中的第二个2替换为9
sed 's/2/9/2' 1.txt 
# 将文件中的所有的2替换为9
sed 's/2/9/g' 1.txt 
# 将文件中的所有的2删除
sed 's/2//g' 1.txt 
# 在每行行首插入#
sed 's/^/#/' 1.txt
# i在包含2的每行行首插入#
sed '/2/s/^/#/' 1.txt
# 在每行行尾插入字符串EOF
sed 's/$/EOF/' 1.txt 

三、awk

格式化文本输出

awk [选项] '模式条件{操作}' 文件1 文件2 . . . .

常用选项:
-F “分隔符” 指明输入时使用到的字段分隔符,默认的分隔符是若干个连续空白符
-v var=value 变量赋值

常见的内置变量:

  • FS 指定每行的字段分隔符,默认为空格或制表位(相当于选项 -F )
  • OFS 输出字段的分隔符,默认也是空格
  • NF 当前处理的行的字段个数(就是:有多少列)
  • NR 当前处理的行的行号(就是:有多少行
  • $0 当前处理的行的整行内容(就是:表示一行的内容)
  • $n 当前处理行的第n个字段(就是:第n列
  • FILENAME 被处理的文件名
  • RS 行分割符。awk从文件上读取资料时,将根据Rs的定义把资料切割成许多条记录,而awk一次仅读取一条记录,预设值是“\n“
  • ORS 输出分割符,默认也是换行符
  • FNR 读取文件的记录数(行号),从1开始,新的文件重新从1开始计数
# -F指定分隔符,以.为分隔符 打印第一列内容,$1显示第一列
awk -F. '{print $1}' study/1.txt 

# 打印以.为分隔符后每行有几列内容
awk -F . '{print NF}' study/1.txt
# 打印以.为分隔符后最后一列内容
awk -F . '{print $NF}' study/1.txt
# 打印以.为分隔符,显示行号和内容,$0显示全部内容
awk -F . '{print NR,$0}' study/1.txt 

# 打印第二行内容
awk 'NR==2{print $0}' study/1.txt 

# BEGIN开头   END结尾,打印包含wold的第一列内容
awk -F . 'BEGIN{print "start"}/wold/{print $1}END{print "stop"}' study/1.txt 

# -v为FS赋值,FS=. 表明分隔符是.
fs=".";awk -v FS=$fs '{print $1FS}' study/1.txt

# 查看第2列包含wo的内容,~表示包含,!~表示不包含
awk -F. '$2~/wo/' study/1.txt 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

克里斯蒂亚诺·罗纳尔达

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值