Linux下的文本处理

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 表示处理第一行 
15 处理第一行至第五行 
/^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'   #把换行符都去掉
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值