Linux 文本处理
Linux 文本处理
find 查看文件
command: find path -option [ -print] [ -exec -ok command ] {} \
Option参数
- -amin n --- 在过去n分钟内被读取的文件
- -answer file --- 比文件file更晚被读取的文件
- -atime n --- 在过去n天内被读取过的文件,+-n 表示n天前和内
- -cmin n --- 在过去n分钟被修改过的文件
- -cnewer file --- 比文件file更新的文件
- -name --- 文件名称符合name的文件
- -size n --- 文件大小为n的文件
- d 目录
- f 一般文件
查找指定后缀文件
find . -name ".c" --- 查找当前目录及子目录下所有后缀为c的文件
find . \( -name "*.txt" -o -name "*.pdf" \) -print --- 查找txt和pdf文件
find . ! -name "*.txt" -print --- 查找非txt的文件
find . -type f --- 当前目录及子目录下的一般文件
find . -ctime 20 ---最近20天更新过的文件列出来
find /var/log -type f -mtime +7 -ok rm {} \; --- 查找/var/log中更改时间在7日前的一般文件并删除
find . -type f -perm 644 -print --- 具有执行权限的所有文件
find . -type f -user BQGao --- 用户BQGao的所有文件
组合命令 xargs & exec
find . -name "*.txt" | xargs rm --- 找到txt文件并删除
find . type f -mtime +10 -name "*.txt" -exce cp {} ~ --- 将找到的文件复制到主目录下
Xargs --- 命令行管道参数转换为后续命令参数
对文件名含有空白字符时,使用-0 参数处理
ls *.txt | xargs ls -al --- 相当于ls -al *.txt
ls *.txt | xargs -t ls -al --- 在执行后面的命令前先将前面的命令打印出来
echo "file 1.txt" "file 2.txt" | xargs -0 rm --- 将stdin 特殊字符当作一般字符处理
参数替换
使用-i 或者-I 实现,将所有.js文件都加上.backup 后缀 , -I {} 表示将后面命令行的{}替换成前面解析出来的参数
ls *.js | xargs -t -I ‘{}’ mv {} {}.backup
sort 排序
Option
- -f 忽略大小写差异
- -b 忽略最前面的空格符部分
- -M 按照月份排序
- -n 使用纯数字进行排序
- -r 逆排序
- -u 删除相同行
- -t 分隔符,默认是[tab]键
- -k 指定区间
Example
- 单个文件排序
-n 表示对文件中的数值列进行排序
shell sort -n -k2 file.txt --- 文件第二列从小到大排序 sort -k9 file.txt --- 基于文件第九列(文件和目录名称,非数值) 排序
-r 表示对文件内容逆排序
shell sort -rn -k2 file.txt --- 文件第二列从大到小排序
-t
分隔符的使用
shell sort -t: -u -k 3 file.txt --- 冒号分隔符对第三列排序,并删除重复行
-k post1[start],post2[end],从起始列的第几个字符到结束列的第几个字符
shell sort -k 1,1 -k 2,2rn file.txt --- 第一列升序,第二列倒序
- 两个文件排序、合并、删除重复行
shell sort -u file1.txt file2.txt --- 文件合并删除重复行排序
more 文件查看
功能
查看文件内容,以页的形式输出到屏幕,支持直接跳转行功能
命令参数
- +n 从第n行开始显示
- -c -l 清除窗口显示
- -s 连续的几个空行显示为一行
操作
- Enter 向下一行
- Space 向下一页
- = 输出当前行号
- :f 输出文件名和当前行行号
- V 调用vim编辑器
- ! 调用shell 并执行命令
实例
more +3 file.txt --- 从文件第三行开始显示
more +/day3 file.txt --- 搜索day关键字,从该处前两行开始显示
uniq 去重命令
参数
- -c 列出改行重复出现的次数
- -d 仅显示重复出现的行列
- -u 显示去重后的行列
uniq file.txt == sort file.txt | uniq == sort -u file.txt --- 去除重复行
uniq -u file.txt == sort file.txt | uniq -u -- 只显示单一行
sort file.txt | uniq -c --- 统计各行在文件中出现的次数
sort file.txt | uniq -d --- 在文件中找出重复的行
tr 转换与删除字符命令
Command
tr -option character**1 character2
- -c 反选字符,符合字符的不处理,不符合部分才进行转换
- -d 删除指令字符
- -s 缩减连续重复的字符成指定的单个字符
- -t 削减SET1 指定范围,使之与SET2 设定长度相等
- character1 转换或删除的字符,如果是转换,需要指定character2
- character2 指定要转换成的目标字符集
### 字符集合
- 特殊字符
- [:alnum:] 所有字母字符与数字
- [:alpha:] 所有字母字符
- [:blank:] 所有水平空格
- [:ctrl:] 所有控制字符
- [:digit:] 所有数字
实例
cat testfile | tr a-z A-Z --- 将文件testfile 中的小写字母全部转换为大写字母
cat testfile | tr [:lower:] [:upper:] --- 同上、
echo "hello 123 world 456" | tr -d '0-9' --- 删除数字字符
cat text | tr '\t' ' ' --- 将制表符转换为空格
echo aa.,a 1 b#bb 2 c&* 3 ddd 4 | tr -d -c '0-9 \n' --- 将不是数字的字符都删除
echo "thissss is a linnnneeee." | tr -s ' sne' --- 删除重复的字符
cat file | tr -s "\r" "\n" > new file == cat file | tr -d "\r" --- 删除windows文件造成的^M字符
paste 按列拼接文本
paste file1 file2 --- 按列将两个文件合并
paste -d : file1 file2 --- 按列合并文件,以冒号隔开,-d 参数指定连接符号
paste -s file1 file2 --- 将文件转换为行形式,然后再按列合并
wc 统计文件字节数、字数、行数
参数
- -c 统计字节数
- -l 统计行数
- -m 统计字符数
- -w 统计字数
实例
wc -l file --- 统计文件行数
wc -c file --- 统计文件字数
ls -l | wc -l --- 统计当前目录下文件数
sed 文本替换
sed -option script filename
参数
- -n 不输出不能被模式匹配到的行到标准输出中
- -e 多项编辑一次执行
- -f file file文件中的每一行是一个操作指令
- -r 支持扩展正则表达式
- -i 直接保存到原文件中
### 正则式
- ^ 表示一行的开头。如 /^#/ 表示以#开头的匹配
- $ 表示一行的结尾。
- \< 表示词首。如\<abc 表示以abc为首的词
- > 表示词尾。
实例
- 首处替换
shell sed 's/text/replace_txt/' file --- 替换每一行第一处匹配到的text sed 's/text/replace_text/2' file --- 替换每行中第二个匹配到的字段 sed '3 s/text/replace_text/' file --- 特殊化行号,只取待第三行匹配 sed '1,3 s/text/replace_text/' file --- 取代1-3行所有匹配的字段
- 全局替换
shell sed 's/text/replace_text/g' file --- 对文中所有符合条件的字段都替换 sed 's/text/replace_text/3g' file --- 从每行第三个到字段到所有字段 sed 's/^/#/g' file --- 每行前面加注释# sed '3,6s/text/replace_text/g' file --- 替换3-6行的匹配字段
- 移除空白行
shell sed '/^$/d' file --- ^表示匹配行开始,$指匹配行结束
- 删除行
Syntax sed ‘nd’ filename
shell sed '3,6d' file --- 删除3-6行 sed '12,$d' file --- 从12行到末尾行 sed '$d' file --- 删除最后一行 sed '/^test/d' file --- 删除所有以test开头的行 sed '2,5!d' file --- 除了2-5行以外都删除
- & 表示模式空间中所有匹配regrexp部分
shell echo "hello123world" | sed -r 's/[0-9] + /:&:/' --- hello:123:world
- 插入空白行
shell sed G file --- 每一行插入空白行 sed 'G;G' file --- 插入两行空白行
文本文件行列式操作命令
cut 按列切分文本
以每一行为一个处理对象,从每一行剪切字节、字符和字段。
参数
- -b 输入每行第n个字符
- -c 输入每行第n个字符(适合中文)
- -d 自定义分隔符,默认是制表符
- -f 与-d 一起使用,指定显示区域
- -n 取消分割多节字符,与-b一起使用
command
cut -[n]b file
cut -c file
cut -d[分隔符] -f[域] file
cut -f2,4 filename --- 截取文件第2列和第4列
cut -f3 --complement filename 去除文件除了第3列的所有列
cut -d : -f 2 filename -- 以:为分隔符,截取文件第2列