添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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

  1. 单个文件排序

-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 --- 第一列升序,第二列倒序

  1. 两个文件排序、合并、删除重复行

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为首的词
  • > 表示词尾。

实例

  1. 首处替换

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行所有匹配的字段

  1. 全局替换

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行的匹配字段

  1. 移除空白行

shell sed '/^$/d' file --- ^表示匹配行开始,$指匹配行结束

  1. 删除行

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行以外都删除

  1. & 表示模式空间中所有匹配regrexp部分

shell echo "hello123world" | sed -r 's/[0-9] + /:&:/' --- hello:123:world

  1. 插入空白行

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列