自我总结 + 优秀摘录
本节将介绍Linux下使用Shell处理文本时最常用的工具: find、grep、xargs、sort、uniq、tr、cut、paste、wc、sed、awk。
1,find文件查找
查找txt和pdf文件 | find .\(-name ".txt" -o -name "*.pdf"\) -print |
正则方式 | find . -regex ".*\(\.txt|.pdf\)$" -iregex: 忽略大小写的正则 |
否定参数 ,查找所有非txt | find . ! -name "*.txt" -print |
置顶搜索深度 | find . -maxdepth 1 -type f |
按类型搜索 | find . -type d -print |
删除当前目录下所有的swp文件 | find . -type f -name "*.swp" -delete |
将当前目录下的所有权变更为weber | find . -type f -user root -exec chown weber {}\; //}是一个特殊的字符串,对于每一个匹配的文件,{}会被替换成相应的文件名 |
2,grep文本搜索
grep match_patten file // 默认访问匹配行
常用参数
- -o 只输出匹配的文本行 VS -v 只输出没有匹配的文本行
-
-c 统计文件中包含文本的次数
grep -c “text” filename
- -n 打印匹配的行号
- -i 搜索时忽略大小写
- -l 只打印文件名
3,xargs命令行参数转换
xargs 能够将输入数据转化为特定命令的命令行参数;这样,可以配合很多命令来组合使用。比如grep,比如find; - 将多行输出转化为单行输出
cat file.txt| xargs
n 是多行文本间的定界符
- 将单行转化为多行输出
cat single.txt | xargs -n 3
-n:指定每行显示的字段数
xargs参数说明
- -d 定义定界符 (默认为空格 多行的定界符为 n)
- -n 指定输出为多行
- -I {} 指定替换字符串,这个字符串在xargs扩展时会被替换掉,用于待执行的命令需要多个参数时
- -0:指定0为输入定界符
示例:
cat file.txt | xargs -I {} ./command.sh -p {} -1 #统计程序行数 find source_dir/ -type f -name "*.cpp" -print0 |xargs -0 wc -l #redis通过string存储数据,通过set存储索引,需要通过索引来查询出所有的值: ./redis-cli smembers $1 | awk '{print $1}'|xargs -I {} ./redis-cli get {}
4,sort排序
- -n 按数字进行排序 VS -d 按字典序进行排序
- -r 逆序排序
- -k N 指定按第N列排序
示例:
sort -nrk 1 data.txt sort -bd data // 忽略像空格之类的前导空白字符
5,uniq消除重复行
6,用tr进行转换
echo 12345 | tr '0-9' '9876543210' //加解密转换,替换对应字符 cat text| tr '\t' ' ' //制表符转空格
7,按列区分文本
8,paste按列拼接文本
9,wc统计行和字符的工具
$wc -l file //统计行数 $wc -w file //统计单词数 $wc -c file //统计字符数
10,sed文本替换利器
- 首处替换
sed 's/text/replace_text/' file //替换每一行的第一处匹配的text
- 全局替换
sed 's/text/replace_text/g' file
默认替换后,输出替换后的内容,如果需要直接替换原文件,使用-i:
sed -i 's/text/repalce_text/g' file
- 移除空白行
sed '/^$/d' file
- 变量转换
已匹配的字符串通过标记&来引用.
echo this is en example | sed 's/\w+/[&]/g' $>[this] [is] [en] [example]
- 子串匹配标记
第一个匹配的括号内容使用标记 1 来引用
sed 's/hello\([0-9]\)/\1/'
- 双引号求值
sed通常用单引号来引用;也可使用双引号,使用双引号后,双引号会对表达式求值:
sed 's/$var/HLLOE/'
当使用双引号时,我们可以在sed样式和替换字符串中指定变量;
eg: p=patten r=replaced echo "line con a patten" | sed "s/$p/$r/g" $>line con a replaced
- 其它示例
字符串插入字符:将文本中每行内容(ABCDEF) 转换为 ABC/DEF:
sed 's/^.\{3\}/&\//g' file