Linux文本处理工具

知识框架图

Linux文本处理工具

学习笔记

查看文本

查看文本内容

cat

-A:显示控制符

-E:显示行结束符$

-n:打印行号,显示空行

-b:打印行号,空行不编号

-s:压缩连续空白行

tac:反向查看文件内容

rev:文本每行倒序显示

分页查看

more

less

查看文件头尾内容

head

-c:前n个字节

-n:前n行

tail

-c

-n

-f:跟踪显示文件变化,常用于日志监控

watch -n 1 tail /var/log/massage

抽取文本内容

cut

-d:分隔符

-fN:指定字段

N:单个字段

,:多个离散字段

-:多个连续字段

混合使用

-c:按字符数

–output-delimiter=:指定输出分隔符

paste:合并两个文件的相同行的列为一行

-d 分隔符:默认TAB

-s:所有行合成一行显示

文本统计

wc

-l:行数

-w:单词数

-c:字节总数

-m:字符总数

-L:最长行的长度

文本排序

sort

-n:按数字大小排序

-r:逆序

-R:随机排序

u:合并相同行

-f:忽略字符串中字符的大小写

-t c:字段界定符

-k N:指定列号

使用举例

echo {1..55} | tr ‘ ‘ ‘\n’ | sort -R | head -n 1

seq 55 | sort -R | head -n 1

echo $[RANDOM%55+1] | sort -R | head -n 1

cut -d’ ‘ -f1 access_log | sort -n | uniq -c | sort -nr | tr -s ‘ ‘ | cut -d’ ‘ -f3

last | sort | cut -d” ” -f1 | uniq -c | sort -nr

uniq

-c:显示连续重复行出现的次数

-d:仅显示重复过的行

-u:仅显示未重复过的行

文本处理三剑客

grep:文本过滤,过滤行

sed:行编辑器

awk:文本报告生成器

grep

根据指定模式搜索并打印匹配到的行

-v:反选

-i:忽略大小写

-n:显示匹配到的行号

-c:统计匹配到行的数量

-o:仅显示匹配到的字符串本身

-q:静默模式

-AN:当前行和后N行

-BN:当前行和前N行

-CN:当前行和前后各N行

nmap -v -sP 172.16.101.0/24 | grep -B1 up | grep “Nmap scan report for” | cut -d’ ‘ -f5

-e:多个模式之间实现逻辑or

-w:匹配整个单词

-E:使用正则表达式

-F:fgrep

df -h |grep “^/dev/sd” |grep -o ‘[[:digit:]]\+%’ |grep -o ‘[[:digit:]]\+’

正则表达式REGEXP

基本正则表达式

字符匹配

.:任意一个字符

[]:指定范围内的任意单个字符

[^]:指定范围外的任意单个字符

[:alnum:] 字母和数字

[:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z

[:lower:] 小写字母 [:upper:] 大写字母

[:blank:] 空白字符(空格和制表符)

[:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)

[:cntrl:] 不可打印的控制字符(退格、删除、警铃…)

[:digit:] 十进制数字 [:xdigit:]十六进制数字

[:graph:] 可打印的非空白字符

[:print:] 可打印字符

[:punct:] 标点符号

匹配次数

*:任意次,工作于贪婪模式

.*:任意长度任意字符

\?:0次或1次

\+:1次或多次

\{m\}:m次

\{m,n\}:m-n次

\{,n\}:最多n次

\{m,\}:最少m次

位置锚定

^:行首锚定

$:行尾锚定

^PATTERN$

^$:空行

^[[:space:]]*$:空白行

\<或\b:词首锚定

\>或\b:词尾锚定

\<PATTERN\>

分组

\(\)

后向引用:\1\2

或者 \|

ifconfig | grep ‘\(\([0-9]\{1,2\}\|1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\.\)\{3\}\([1-9]\|[1-9][0-9]\|1[0-9]\{2\}\|2[0-4][0-9]\|25[0-5]\)’

扩展正则表达式

字符匹配

.:任意单个字符

[]:指定范围内的单个字符

[^]:指定范围外的任意单个字符

次数匹配

*:任意次

?:最多1次

+:至少1次

{m}:m次

{m,n}:m-n次

位置锚定

^:行首锚定

$:行尾锚定

^PATTERN$

^$:空白行

\<或\b:词首锚定

\>或\b:词尾锚定

\<PATTERN\>

分组

()

后向引用:\1、\2

或者

|

ls *.rpm | grep -Eo “\.\<[[:alnum:]_]+\>\.rpm$” |cut -d. -f2 |sort |uniq -c

ls *.rpm | grep -Eo “\.[^.]+\.rpm$” |cut -d. -f2|sort |uniq -c

ifconfig | grep -E ‘(([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]{1,2}|1[0-9][0-9]|2[0-4][0-9]|25[0-5])’

ls *.rpm |rev |cut -d. -f2|rev |sort |uniq -c

sed:行编辑器

语法

sed [option]… ‘script’ inputfile…

常用选项

-n:不输出模式空间内容到屏幕

-e:多点编辑

-f /path/to/script_file:从指定文件中读取编辑脚本

-r:支持使用扩展正则表达式

-i.bak:备份文件并原处编辑

script

‘地址+命令’

地址定界

不给地址:全文处理

单个地址

#:指定的行

$:最后一行

/PAT/:模式匹配到的每一行

地址范围

m,n

m,+n

/PAT1/,/PAT2/

m,/PAT/

步进:~

1~2:奇数行

2~2:偶数行

编辑命令

d:删除模式空间匹配的行,并进入下一轮循环

p:打印模式空间的内容,追加到默认输出后

a [\]text:在指定行后面追加文本,\n实现多行追加,\t为Tab

i [\]text:在行前面插入文本

c [\]text:替换行为单行或多行

w /path/to/somefile:保存模式匹配的行到指定文件

r /path/from/somefile:读取指定文件的文本至模式空间中匹配到行后

=:为模式空间中的行打印行号

!:模式空间中匹配行取反处理

查找替换

s///

替换标记

g:全局替换

p:显示替换成功的行

w /path/to/somefile:将替换成功的行保存在文件中

sed ‘s/quiet/& net.ifnames=0/’ /etc/default/grub

sed ‘/GRUB_CMDLINE_LINUX/s/”$/ net.ifnames=0 &/’ /etc/default/grub

sed -r ‘/GRUB_CMDLINE_LINUX/s/(.*)”/\1 net.ifnames=0″/’ /etc/default/grub

sed调用变量

“$VAR”

”’VAR”’

高级编辑命令

h:把模式空间中的内容覆盖至保持空间中

H:把模式空间中的内容追加至保持空间中

g:从保持空间中取出数据覆盖至模式空间

G:从保持空间中取出数据追加至模式空间

x:把模式空间和保持空间中的内容互换

n:读取匹配到的行的下一行至模式空间

N:追加匹配到的行的下一行至模式空间

d:删除模式空间中的行

D:删除多行模式空间的所有行

使用举例

sed -n ‘n;p’ FILE:显示偶数行

sed ‘1!G;h;$!d’ FILE:逆序显示文件内容

sed ‘$!N;$!D’ FILE:取出文件后两行

sed ‘$!d’ FILE:取出文件最后一行

sed ‘G’ FILE:每行后面追加空白行

sed ‘/^$/d;G’ FILE:将多个空白行合并成一个空白行,在每行后追加空白行

sed ‘n;d’ FILE:显示奇数行

sed -n ‘1!G;h;$p’ FILE:逆序显示文件内容

awk,报告生成器

基本用法

awk [options] ‘program’ var=value file…

awk [options] -f programfile var=value file…

awk [options] ‘BEGIN{ action;… } pattern{ action;… } END{ action;… }’ file …

awk 程序通常由:BEGIN语句块、能够使用模式匹配的通用语句块、 END语句块,共3部分组成

program通常是被单引号或双引号中

基本格式

awk [options] ‘program’ file…

options

-F 指明输入时用到的字段分隔符

-v var=value:自定义变量

program包括pattern{actions;…}

pattern部分指定语句的触发条件

BEGIN,END

actions指明对数据进行的处理操作

print,printf

分割符、域、记录

由分割符分割的字段(域)标记$1、$2…称为域标识,$0为所有域

文件的每一行称为记录

省略action,默认执行print $0操作

工作原理

1、执行BEGIN语句块中的语句,可选,进行如变量初始化、打印表头等操作

2、从文件或标准输入读取一行然后执行pattern{action;…}语句块,重复执行该操作直到文件最后一行。可选,没有提供pattern语句则默认执行{print}打印读取到的每一行

3、文件读取完毕后,执行END{action;…}语句块,可选,进行如打印所有行的分析结果的汇总信息等

print

print item1,item2…

,分隔符

输出的各item可以为字符串、数值、当前记录的字段、变量、awk表达式

省略item默认打印$0

变量

分为内置和自定义变量

内置变量

FS:输入字段分隔符,默认为空白字符

OFS:输出字段分隔符,默认为空白字符

RS:输入记录分隔符,指定输入时的换行符

ORS:输出记录分隔符,输出时用指定符号代替换行符

NF:字段数量

NR:记录号

FNR:各文件分别计数

FILENAME:当前文件名

ARGC:命令行参数个数,awk命令自己也是参数

ARGV:属组,保存命令行各参数

自定义变量

-v var=value

在program中直接定义

printf:格式化输出

printf “FORMAT”,item1,item2…

必须指定FORMAT

不自动换行,需显式指定\n

FORMAT中的格式符和各item一一对应

格式符

%c: 显示字符的ASCII码

%d, %i: 显示十进制整数

%e, %E:显示科学计数法数值

%f:显示为浮点数

%g, %G:以科学计数法或浮点形式显示数值

%s:显示字符串

%u:无符号整数

%%: 显示%自身

修饰符

m[.n]:m指定显示的宽度,n指定小数点后的精度

-:左对齐

+:显示数值的正负符号

操作符

算数操作符

x+y, x-y, x*y, x/y, x^y, x%y

-x: 转换为负数

+x: 转换为数值

字符串操作符:没有符号的操作符,字符串连接

赋值操作符

=, +=, -=, *=, /=, %=, ^=

++, —

比较操作符

==, !=, >, >=, <, <=

模式操作符

~:左边是否和右边匹配

!~:是否不匹配

逻辑操作符

&&、||、!

函数调用

function_name(argu1, argu2, …)

条件表达式

selector?if-true-expression:if-false-expression

awk -F: ‘{$3>=1000?usertype=”Common User”:usertype=”Sysadmin or SysUser”;printf “%15s:%-s\n”,$1,usertype}’ /etc/passwd

PATTERN

根据pattern条件过滤匹配的行,再做处理

未指定:空模式,匹配每一行

/正则表达式/

awk ‘/^UUID/{print $1}’ /etc/fstab

关系表达式,结果为真才会处理

真:非0,非空字符串

假:0,空字符串

awk -F: ‘$NF==”/bin/bash”{print $1,$NF}’ /etc/passwd

行范围

startline,endline:不支持直接给出数字格式

awk -F: ‘/^root\>/,/^nobody\>/{print $1}’ /etc/passwd

BEGIN、END

BEGIN{}:仅在开始处理文件中的文本之前执行一次

END{}:仅在文本处理完之后执行一次

awk -F: ‘BEGIN{print ” USER UID \n————— “}{print $1,$3}’END{print “==============”} /etc/passwd

action

常用分类

Expressions:算术,比较表达式等

Control statements:if, while等

Compound statements:组合语句

input statements

output statements:print等

控制语句

{ statements;… } 组合语句

if(condition) {statements;…}

if(condition) {statements;…} else {statements;…}

对awk取得的整行或某个字段做条件判断

awk -F: ‘{if($3>=1000) printf “Common user: %s\n”,$1;else printf “root or Sysuser: %s\n”,$1}’ /etc/passwd

while(conditon) {statments;…}

对一行内的多个字段逐一类似处理时使用

对数组中的各元素逐一处理时使用

awk ‘/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=10){print $i,length($i)}; i++}}’ /etc/grub2.cfg

do {statements;…} while(condition)

不论真假,至少执行一次循环体

awk ‘BEGIN{ total=0;i=0;do{ total+=i;i++;}while(i<=100);print total}’

for(expr1;expr2;expr3) {statements;…}

awk ‘BEGIN{sum=0;for(i=1;i<=100;i++){sum+=i};print sum}’

awk ‘BEGIN{sum=0;i=1;while(i<=100){sum+=i;i++};print “sum=”sum” i=”i}’

for(variable assignment;condition;iteration process)

{for-body}

for(var in array) {for-body}:遍历属组元素

awk ‘/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}’ /etc/grub2.cfg

awk ‘{ips[$1]++}END{for(ip in ips){print ip,ips[ip]}}’ /var/log/httpd/access_log

break:结束所有循环

continue:结束本次循环,执行下一次循环

next:提前结束本次处理而直接进入下一次处理

awk -F: ‘{if($3%2!=0) next; print $1,$3}’ /etc/passwd

delete array[index]

delete array

exit

vim

打开文件

+N:打开文件后,光标处于第N行首

+/PATTERN:打开文件后,光标处于模式匹配到的第一行行首

-b:二进制方式打开文件

-d file… :比较多个文件

ex file或vim -e: 直接进入ex模式

vim三种模式

命令模式:默认,光标移动,剪切、粘贴文本

插入模式:编辑文本

末行模式:内置的命令行接口,保存、退出等

ESC退出当前模式

模式转换

命令模式–>插入模式

i:insert,在光标所在位置插入

I:在光标所在行首插入

a:append,在光标后面插入

A:在光标所在行尾插入

o:在光标所在行的下面新建一行插入

O:在光标所在行的上面新建一行插入

插入模式–>命令模式

ESC

命令模式–>末行模式


末行模式–命令模式

ESC

关闭文件

末行模式

:q

:q!

:wq

:x

命令模式

ZZ:保存退出

ZQ:不保存退出

命令模式

光标跳转

字符间:h、j、k、l,在命令前加数字可指定跳转的字符数

单词间

w:下一单词词首

e:当前或下一单词词尾

b:当前或下一单词词首

在命令前加数字可指定跳转的单词数

当前页

H:页首

M:中间行

L:页底

行首尾

^:行首第一个非空白字符

0:行首

$:行尾

行间

nG:第n行

G:最后一行

1G、gg:第一行

句间

(:上一句

):下一句

段落间

{:上一段

}:下一段

编辑操作

字符编辑

x:删除光标处字符,#x指定从光标处开始的字符数

xp:交换光标处和后一位字符的位置

~:转换大小写

J:删除当前行后的换行符

字符替换

r:替换光标处的字符

R:切换为”替换”模式

删除

d:结合跳转字符,实现指定范围删除

d$、d^、d0、dw、de、db

#CMD

dd:删除光标所在行,#dd删除多行

D:光标处删除至行尾,留空行

复制

y:结合跳转字符,实现指定范围复制

y$、y^、y0、yw、ye、yb

#CMD

yy:光标所在处整行复制,#yy复制多行

Y:整行复制

粘贴

p:若缓存区为整行,则粘贴到下一行;否则粘贴至光标后面

P:若缓存区为整行,则粘贴到上一行;否则粘贴至光标前面

修改

c:结合跳转字符,实现指定范围修改

c$、c^、c0、cw、ce、cb

#CMD

cc:删除当前行并输入新内容,#cc

C:删除光标到行尾并插入

撤销更改

u:最近一次更改,#n最近#次

U:光标落在该行后的所有更改

Ctrl-r:重做最后的撤销

.:重复前一操作

#.:重复前一操作#次

可视化操作

选择文本块

v:字符

V:行

Ctrl-v:块

结合字符跳转键使用

突出显示的文字可执行删除、复制、变更、过滤、搜索、替换等

末行模式

命令提示符为:

可用命令

w

wq

x

q

q!

r filename

w filename

!CMD:执行命令

r!CMD:读入命令的输出

地址定界

:start,end

#:第#行

m,n:m-n行

m,+n:m行和其后n行

.:当前行

$:最后一行

%:全文

/PAT1/,/PAT2/:PAT1到PAT2第一次匹配

#,/PAT/

/PAT/,#

使用方式:后跟编辑命令

d

y

w filename:指定范围另存到指定文件中

r filename:在指定范围出入指定文件中的内容

查找

/PAT:从光标处向文件尾部查找

?PAT:从光标处向文件首部查找

n:和命令同向

N:和命令反向

查找并替换

s/要查找的内容/替换为的内容/修饰符

要查找的内容:可用模式匹配

替换为的内容:不能使用模式,可使用\1、\2等后向引用,&引用前面查找到的整个内容

修饰符

i:忽略大小写

g:全局替换,默认只替换每行第一次匹配

gc:全局替换,替换前询问

分隔符/可使用其他字符

多个窗口

多文件分割

vim -o|O file1 file2

-o:水平分割

-O:垂直分割

窗口间切换:Ctrl-w,方向键

单文件分割

Ctrl-w,s:水平

Ctrl-w,v:垂直

Ctrl-w,q:取消相邻窗口

Ctrl-w,o:取消所有窗口

:wqall:退出

定制工作特性

配置文件

全局:/etc/vimrc

个人:~/.vimrc

末行模式:对当前vim进程有效

常用配置

行号

显示:set nu

不显示:set nonu

忽略字符大小写

忽略:set ic

不忽略:set noic

自动缩进

启用:set ai

禁用:set noai

智能缩进

启用:set si

禁用:set nosi

高亮搜索

启用:set hlsearch

禁用:set nohlsearch

语法高亮

启用:syntax on

禁用:syntax off

显示Tab和换行符

启用:set list

禁用:set nolist

文件格式

启用windows格式:set ff=dos

启用unix格式:set ff=unix

设置文本宽度

启用:set textwidth=65

禁用:set wrapmargin=15

设置光标所在行标识线

启用:set cul

禁用:set nocul

复制保留格式

启用:set paste

禁用:set nopaste

设置Tab为4个空格

set ts=4

set expandtab

set autoindent

原创文章,作者:ZBD20,如若转载,请注明出处:http://www.178linux.com/92545

(0)
ZBD20ZBD20
上一篇 2018-03-17
下一篇 2018-03-17

相关推荐

  • 程序包的编译安装

    程序包的编译安装     程序包的编译安装是比较重要的内容,在之后的网络知识以及服务的配置等学习方面也发挥着重要作用,是我们的必备技能。 一、杂项知识整理 1、which –skip-alias:跳过别名,直接查看原命令 [root@localhost ~]# which –…

    Linux干货 2016-08-24
  • Linux发行版的基础目录名称命名法则及功用规定

    [root@localhost /]# tree -L 1. <—-> 为 / 符号,所有文件的根目录;├── bin -> usr/bin <—-> 所有用户可用的基本命令程序文件;├── boot <—-> 引导加载器必须用到的各静态文件:kernel,initramfs(in…

    2018-02-28
  • LAMP 通过使用脚本的方式安装并部署Discuz

    该脚本有很多辅助的部分,主要是为了让脚本在中途运行失败可以多次运行,所产生的结果是预期的,与第一运行并成功的结果是一样的。初次摄入bash脚本有很多不足,敬请指正。 所需要的软件 apr-1.5.2.tar.bz2 apr-util-1.5.4.tar.bz2 Discuz_X3.2_SC_UTF8.zip freetype-2.5.4.tar.gz htt…

    Linux干货 2016-04-05
  • 马哥教育网络班20期第2周课程练习

    一、Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关  示例演示。 linux上文件管理命令包括: ls,cat,pwd,cp,rm,cd,head,tail,more,less,cut,which,whereis,find,mkdir,mv; 1、ls 命令;显示文件/文件夹清单   例如:如下显示列出根目录下的文件及目录…

    Linux干货 2016-06-23
  • man,男人的使用方法

        Linux中有个很强大的男人,这个男人就是man。任何不懂得命令和或者配置文件我们都可以去man,所以请深爱这个男人;     我们输入 man ls,它会在最左上角显示“LS(1)”,在这里,“LS”表示手册名称,而“(1)”表示该手册位于第一节章,同样,我们输入“ma…

    Linux干货 2016-07-26
  • test

    test

    Linux干货 2018-02-23