管道符后面可以先xargs, 将Tab和回车换成空格, 字符串分割成参数再交给其他的grep/awk/sed处理:
xargs命令可以通过管道接受字符串,并将接收到的字符串通过空格分割成许多参数(默认情况下是通过空格分割) 然后将参数传递给其后面的命令,作为后面命令的命令行参数
如:
cat 1.txt | xargs grep 2020
cat 1.txt | cat # 输出1.txt, 因为cat把字符串整体处理依旧当成字符串
sed
sed更适用于修改文本内容
查询
sed + file
会直接输出文件的全部内容
sed -n +file
-n参数指定了只打印符合后面要求的行
sed -n 'xxxxxp' file
单引号' '里面放的是要匹配的内容, 注意最后有一个p, 代表要将匹配内容打印出来, 有两种类型
- 行号
- / 具体的内容/
sed -n '1p' file.txt # 打印第一行的内容
sed -n '1,5p' file.txt # 打印1~5行的内容
sed -n '/info/p' file.txt # 打印有"info"的行
sed -n '/info/, /warning/' file.txt # 打印有info或者warning的行
sed -n ' /info/, 5' file.txt # 打印有info的行, 直到第五行
sed -n '1,5!p' file.txt # 打印!(1~5)行的内容, 注意!将它前面的内容取反
"p"选项还有其他的, 如=可以打印行号, 如果有多个选项, 那么需要用{}包括, 并且每一个选项后面有分号, 如{=;p;}
-r模式支持正则表达式, 可以参考cnblog的文档
增删改
必须使用-e模式来启用动作, 如果后面直接接文件就是在源文件上修改
名称 | 动作 | 说明 |
---|---|---|
a | 新增 | sed -e 4a\newLine testfile 第四行后面新加一行, 并写上newLine, 结果放到stdout中 |
d | 删除 | sed '2,5d' 删除2~5行打印 |
i | 插入 | |
p | 打印 | |
c/s | 取代 |
sed -n '/root/{s/bash/blueshell/;p;q}' # 找到root所在的行, 把bash替换成blueshell, 显示并退出
sed -i '$a # This is a test' regular_express.txt # $代表最后一行, a代表追加
grep
-r 递归查找某一个文件夹而不是某一个文件
-v "逆反", 寻找不含指定字符串的行
-e 开启正则表达式(注意和sed的-r不同)
awk
awk更适用于格式化文本, 复杂处理
格式: awk '操作行为' filename
操作行为
操作行为是每行执行一次
print 打印, 包括双引号的字符串常量, $n代表的元素或者自定义的变量, print不同的东西用逗号隔开
awk 'print $1, $3' myfile.txt

分隔符是可以自定义的, 通过-F 参数可以指定, 甚至可以有多个分隔符
awk内置的变量也可以输出或者修改

可以指定在循环开始前BEGIN或者结束后END的代码, 所有的代码都放在单引号中, 但是不同的花括号中
awk '{count++;print $0;} END{print "user count is ",count}' passwd
# 在统计每一行之后, 输出总用户数量
awk还支持C语言的常见结构, 如if, while等. 还支持关联数组(map)
awk还有内置函数, 和c语言的string函数类似, split(原, 目的数组, 分割字符), substr() 等
find
find --name myfile.txt
网友评论