文本处理
vim 文本编辑器
三种模式:
普通模式:
vim a.txt
插入模式:
a i o
命令模式:
yy复制,dd剪切,p粘贴,uu还原为命令前的文本,gg回到行首,G回到行尾
/+内容,可进行查找
set nu 带行号
s替换所有行的内容: /a/ab/s # 把a替换成ab
:s/from/to/g #将当前行中的所有from都替换成to
:%s/from/to/g #对所有行的所有from都替换成to
:33s/from/to/g #在第33行进行替换操作。
:10,20s/from/to/g #对第10行到第20行的内容进行替换。
grep:行级过滤
-n:匹配到的行带行号
-i:不区分大小写
grep -i -n "root" /etc/passwd
-e:指定字符串做为查找文件内容的样式,精确查找
-E:用来扩展选项为正则表达式。应该使用 | 来分割多个参数。grep -E 等同于egrep
cat /etc/passwd | grep -E 'root|tss'
cat /etc/passwd | grep -e 'root' -e 'tss'
-A: after 找到关键字那行的前几行
例:cat a.txt | grep -A 3 abc
-B:before 找到关键字那行后面几行
cat a.txt | grep -B 4 abc
-r:搜索子目录,通常-rl一起用
-l:如果匹配成功,则只将文件名打印出来,失败则不打印
grep -rl 'nginx' /etc #遍历整个/etc 目录下,列出包含nginx内容的文件名
crontab -l | grep -v "^$" #去除空行
crontab -l | grep -v '^\s*$' #去除空行
单引号与双引号
单引号:表示强引用,只匹配引号内的内容
双引号:双引号内可以使用变量$a,查找$a的值
a=root
grep "$a" /etc/passwd
查找目录下包含 ssl关键字的文件
grep -r "ssl" /path/to/directory #查找目录下包含ssl内容的文件名
grep -ir "ssl" /path/to/directory #不区分大小写
sed:流编辑器
一般处理大文件,是一种非交互式文本编辑器,默认不修改原文件
原理:一行一行处理,从文件第一行开始读取,放到模式空间中,进行相应处理,处理完毕将结果
输出到屏幕上,然后继续读取下一行,知道所有行都处理完毕
用法:sed [选项] [定址/定界+处理动作] 文件列表
sed -n '1,5d' test.txt
选项:
-n :显示处理结果,一般与p连用
-i :直接修改原文件(很重要)
定址/定界:
1 表示处理第一行
1,5 处理第一行至第五行
/^root/ 处理以root开头的行 ,
多个正则以,隔开
命令:
#d:删除
cp /etc/passwd /etc/passwd.bak
sed '/ : x : /d' /etc/passwd #删除带 :x: 的行
#p:打印
sed -n '3,5p' /etc/passwd #打印第三行和第五行
#!:非
sed '3!d' /etc/passwd 打印第三行(除了第三行,其他全部删除)
#r:读取外部一个文件
sed '/^root/r /test/a' /test/b #在b文件中root开头的行下面添加a文件的内容
#w:将匹配到的内容,保存到外部的一个文件中
sed '/^root/w /etc/passwd' /test/a #把passwd文件中root开头的行保存到a文件中(覆盖原文件)
#a:追加,在匹配到的行的下一行插入一行
sed '/root/a hello root' /etc/passwd 在passwd文件中root下一行追加一行hello root
#i:插入,在匹配到的行的上一行插入一行
sed -i 's#abcd efg#sadvfasdv sasdvfa#' a.txt #直接替换文本中的abcd efg 为sadvfasdv sasdvfa
#c:替换,将匹配到的内容替换成新的内容(整行)
sed '/root/c aaa' /etc/passwd #把root都替换成aaa
#q:退出,不再向模式空间读入新的行
sed '1q' passwd
#s:查找替换 (一行中的部分内容,一般加正则使用)
#修饰符g:全局替换 p:打印 w:另存为 n:n为数字,替换第n个匹配到的内容
#使用:定址s/模式匹配(旧的内容)/新的内容/修饰符
sed 's/^./ /g' /etc/passwd #以空白代替每一行的开头字母
sed -i 's/^.*a b_c.*$/set num_aaa' a.txt #对文本中关键字a b_c 进行通配不在开头和结尾也可以,匹配到的更改为set num_aaa
为文本里的数字添加双引号
为文件里的所有数字添加双引号
sed -i 's/\b\([0-9]\+\)\b/"\1"/g' 文件名
#\b([0-9]+)\b表示匹配一个独立的数字
#"\1" 将匹配到的数字加上双引号
#-i 源文件修改
文本中有固定关键字string data ,对关键字这行添加双引号
文本内容:
[buff]
0
[icon image]
`` 0
[max overlap]
1
[int data]
[/int data]
[string data] `[swordman]` 25 `[dungeon type]` `[level]` 1 `+` 9000
[/string data]
[float data]
[/float data]
sed -E '/\[string data\]/{s/([0-9]+)/"\1"/g}' test.txt
# -E 表示使用扩展正则表达式
# 匹配关键字 string data
# ([0-9]+) 表示所有数字
# "\1" 对匹配到的数字添加双引号
# test.txt 你的文本文件
文本中有固定关键字string data ,对关键字这行的下一行添加双引号
文本内容如下:我需要对 string data 下一行里的数字添加双引号
[buff]
0
[icon image]
`` 0
[max overlap]
1
[int data]
[/int data]
[string data]
`[swordman]` 25 `[dungeon type]` `[level]` 1 `+` 9000
[/string data]
[float data]
[/float data]
sed -E '/\[string data\]/{n; s/([0-9]+)/"\1"/g}' test.txt
#匹配包含[string data] 的行
#-E表示使用扩展正则表达式
#n表示下一行
#s/([0-9]+)/"\1"/g 对一行内的数字添加双引号
sed -E 's/([0-9]+)/"\1"/g')
查看文件时去除空行
crontab -l |sed '/^\s*$/d' #去除空行
模式空间:
保留空间:保留文本行,默认有一个空行
命令:
h:将模式空间的内容复制到保留空间——————覆盖模式
H:将模式空间的内容追加到保留空间——————追加模式
g:将保留空间的内容复制到模式空间——————覆盖模式
G:将保留空间的内容追加到模式空间——————追加模式
sed '1{h;d};2G' /etc/passwd #交换第一行和第二行;
awk:一种编程语言,文本编辑器
功能:对文本数据进行汇总和处理,是一个报告的主生成器,能够对数据进行排版
工作过程:将文件中的内容逐行进行扫描,把整行内容存入内置变量$0中;在按照指定的分隔符(默认分隔符为空白)将输入行切成若干个列(字段),在读取下一行,循环处理,指定处理结束
语法:awk [选项] ‘/定址/{处理动作1;处理动作2;…}’ 文件列表
简单使用:
awk -F : '{print $1,$3}' /etc/passwd #打印passwd中用户名和UID
ip a s | grep global | awk '{print $2}' #切割出IP
#可指定多个分隔符 :/
awk -F "[:/]" '{print $1,$3}' /etc/passwd #多个分隔符,以:/为分割符
#默认awk使用空白来做分隔符,不管有几个空白,都当做一个分隔符,分隔符可做为数字,字母,符号
awk -F "" '{print $1,$2}' /etc/passwd #以空白为分隔符
awk -F ":" '{print $1"\t"$3}' /etc/passwd #制表符,列对齐更美观\t
awk NF /etc/passwd #去除空行
第一列和第二列文本进行替换
文本hosts 第一列和第二列进行替换,附加到temp.txt 文件,变更temp.txt 文件为hosts ,完成文本替换
awk '{temp=$1; $1=$2; $2=temp; print}' hosts > temp.txt && mv temp.txt hosts
特殊的文本处理
ll -d /etc #查看文件夹的权限
去除空格
cat a.txt | sed s/[[:space:]]//g
去除空行
cat 文件名 |tr -s '\n' #去除空行
cat 文件名 |sed '/^$/d'
cat 文件名 |awk '{if($0!="")print}'
cat 文件名 |awk '{if(length !=0) print KaTeX parse error: Expected 'EOF', got '}' at position 2: 0}̲' grep -v "^" 文件名
awk NF /etc/passwd #去除空行
crontab -l |sed '/^\s*$/d' #去除空行
一列转换为一行
awk 'BEGIN{RS="\n"; ORS=","}{print}END{printf("\n")}'
#ORS="," 这里指定“,”为分割符,可以为写任意分割符
一行转换为一列
sed 's/ /\n/g' test.txt #已空格为分隔符,进行换行
cat test.txt | tr " " "\n" #已空格为分隔符,进行换行
cat test.txt | xargs -n 1 #已空格为分隔符,进行换行
awk '{gsub(" ", "\n"); print $0}' test.txt
awk 'BEGIN{RS = " "}{print $0}' test.txt
awk 'BEGIN{RS = " "; ORS = "\n"} {print $0}' test.txt
转换分割符
cat a.txt |tr " " ","
#把空格换成“,”
wc:统计行信息
-l 文件名:统计有多少行
-c 文件名:统计文件中字符数
-w 文件名:统计文件有多少单词
wc -l /etc/passwd #统计passwd文件有多少行
tee:中转结果到目标文件
一般与cat和grep连用:
例:cat /etc/passwd | grep root | tee test(该文件必须存在)
cut:切割
-d:指定分隔符
-f:指定输出区域,多个用逗号隔开
-n:查看有多少行
cut -d ":" -f 3 /etc/passwd #按照":"切割出passwd文件中第3列的内容
sort:排序
-r 逆序排序
-n 按照数值大小
-u 去掉重复值
-t 指定分割符“/” “,” 等
-k 指定输出区域
sort -t ":" -k 3,5 passwd #以":"为分隔符,按照第3,5列进行排序
uniq:去重 去掉相邻的行(于sort连用)
uniq
-c:统计重复行数
-d: 只显示重复的行
crontab -l | uniq -d
sort file1 | uniq #排序后相同的行就相邻在一起了,在进行去重
tr 转换字符
-s 把多个重复的字符以单一字符显示
tr -s " :" " /" [文件] #把 :替换成/
tr -s "[:space:]" "@" [文件] #把空白替换成@
crontab -l | tr -s '\n' #把换行符都去掉