Linux——shell 文本处理

        1.cut命令

 1.1命令格式

1.2命令样例

2.awk命令

2.1printf格式化输出

2.2演示数据

2.3awk命令格式

2.4awk

2.5用例

3.sed命令

3.1语法

4.sort命令

4.1命令格式

  4.2测试样例


1.cut命令

cut 命令的默认分隔符是制表符,也就是“tab”键

 1.1命令格式

cut [选项] 文件名 
-f 列号:	提取第几列
-d 分隔符:	按照指定分隔符分割列
-c 字符范围:	不依赖分隔符来区分列,而是通过字符范围(行首为 0)来进行字段 提取。“n-”表示从第 n 个字符到行尾;“n-m”从第 n 个字符到第 m 个字符;“-m”表示从第 1 个字符到第 m 个字符。

1.2命令样例

数据
vi student.txt
ID	Name	gender	Mark
1	Liming	M	86
2	Sc	    M	90
3	Tg	    M	83

cut -f 2 student.txt 截取第二列
grep -v 'Name' student.txt|cut -f 2 student.txt 去掉列头展示第二列
cut -f 2,3 student.txt 截取第2,3列
cut -d ':' -f 1,2,3 /etc/passwd 使用:分割/etc/passwd每行,并截取1,2,3列

2.awk命令

2.1printf格式化输出

printf ‘输出类型输出格式’ 输出内容 输出类型:

%ns:	输出字符串。n 是数字指代输出几个字符
%ni:	输出整数。n 是数字指代输出几个数字
%m.nf:	输出浮点数。m 和 n 是数字,指代输出的整数位数和小数位数。如%8.2f
代表共输出 8 位数,其中 2 位是小数,6 位是整数。

输出格式:
\a:	输出警告声音
\b:	输出退格键,也就是 Backspace 键
\f:	清除屏幕
\n:	换行
\r:	回车,也就是 Enter 键
\t:	水平输出退格键,也就是 Tab 键
\v:	垂直输出退格键,也就是 Tab 键

2.2演示数据

vi student.txt
ID	Name	PHP	Linux	MySQL	Average
1	Liming	82	95	86	87.66
2	Sc	74	96	87	85.66
3	Tg	99	83	93	91.66

printf '%s' $(cat student.txt) 格式混乱
printf '%s\t %s\t %s\t %s\t %s\t %s\t \n' $(cat student.txt) 按照指定格式输出
printf '%i\t %s\t %i\t %i\t %i\t %8.2f\t \n' \
$(cat student.txt | grep -v Name)  将字段转换为指定类型

2.3awk命令格式

awk ‘条件 1{动作 1} 条件 2{动作 2}…’ 文件名

awk '{printf $2 "\t" $6 "\n"}' student.txt 输出第二列和第6列

2.4awk条件

条件的类型

条 件

 

说             明

 

 

awk 保留字

 

BEGIN

在 awk 程序一开始时,尚未读取任何数据之前执行。BEGIN 后

的动作只在程序开始时执行一次

 

END

在 awk 程序处理完所有数据,即将结束时执行。END 后的动作

只在程序结束时执行一次

 

>

<

>=

大于

小于

大于等于

 

 

<=

小于等于

 

关系运算符

 

==

等于。用于判断两个值是否相等,如果是给变量赋值,请使用

“=”号

 

!=

不等于

 

 

A~B

判断字符串 A 中是否包含能匹配 B 表达式的子字符串

 

A!~B

判断字符串 A 中是否不包含能匹配 B 表达式的子字符串

正则表达式

/正则/

如果在“//”中可以写入字符,也可以支持正则表达式

awk执行流程

1) 如果有 BEGIN 条件,则先执行 BEGIN 定义的动作

2) 如果没有 BEGIN 条件,则读入第一行,把第一行的数据依次赋予$0、$1、$2 等变量。其中$0

代表此行的整体数据,$1 代表第一字段,$2 代表第二字段。

2) 依据条件类型判断动作是否执行。如果条件符合,则执行动作,否则读入下一行数据。如果 没有条件,则每行都执行动作。

3) 读入下一行数据,重复执行以上步骤。 

awk 内置变量

awk 内置变量

作          用

 

$0

代表目前 awk 所读入的整行数据。我们已知 awk 是一行一行读入数据

的,$0 就代表当前读入行的整行数据。

$n

代表目前读入行的第 n 个字段。

NF

当前行拥有的字段(列)总数。

NR

当前 awk 所处理的行,是总数据的第几行。

 

FS

用户定义分隔符。awk 的默认分隔符是任何空格,如果想要使用其他

分隔符(如“:”),就需要 FS 变量定义。

ARGC

命令行参数个数。

ARGV

命令行参数数组。

FNR

当前文件中的当前记录数(对输入文件起始为 1)。

OFMT

数值的输出格式(默认为%.6g)。

OFS

输出字段的分隔符(默认为空格)。

ORS

输出记录分隔符(默认为换行符)。

RS

输入记录分隔符(默认为换行符)。

2.5用例

cat student.txt | grep -v Name |	\
awk '$6 >= 87 {printf $2 "\n" }'  #判断第6列的值大于87,如果成立打印第二行
awk '$2 ~ /Sc/ {printf $6 "\n"}' student.txt 获取Sc的成绩
cat /etc/passwd | grep "/bin/bash" | \
awk '{FS=":"} {printf $1 "\t" $3 "\n"}' 查询可以登录用户的 name和UID

3.sed命令

sed 主要是用来将数据进行选取、替换、删除、新增的命令

3.1语法

 sed [选项] ‘[动作]’ 文件名 
选项:
-n:	一般 sed 命令会把所有数据都输出到屏幕,如果加入此选择,则只会 把经过 sed 命令处理的行输出到屏幕。
-e:	允许对输入数据应用多条 sed 命令编辑。
-f 脚本文件名: 从 sed 脚本中读入 sed 操作。和 awk 命令的-f 非常类似。
-r:	在 sed 中支持扩展正则表达式。
-i:	用 sed 的修改结果直接修改读取数据的文件,而不是由屏幕输出

动作:
a \:	追加,在当前行后添加一行或多行。添加多行时,除最后 一行外, 每行末尾需要用“\”代表数据未完结。
c \:	行替换,用 c 后面的字符串替换原数据行,替换多行时,除最后一行 外,每行末尾需用“\”代表数据未完结。
i \:	插入,在当期行前插入一行或多行。插入多行时,除最后 一行外, 每行末尾需要用“\”代表数据未完结。
d:	删除,删除指定的行。
p:	打印,输出指定的行。
s:	字串替换,用一个字符串替换另外一个字符串。格式为“行范围 s/
旧字串/新字串/g”(和 vim 中的替换格式类似)。

3.2练习

sed -n '2p' student.txt 打印第二行
sed '2,4d' student.txt 删除第2-4行 ,并没有修改文件的内容,
sed -i '2,4d' student.txt 删除第2-4行,并修改文件的内容
sed '2a hello' student.txt 在第二行后面追加hello
sed '2i hello \
> world' student.txt 在第二行前插入 两行 \为换行符
cat student.txt | sed '2c No such person'  替换第二行为指定的字符
sed ‘s/旧字串/新字串/g’ 文件名 字符串替换
sed '3s/74/99/g' student.txt 替换第三行中的字符串
sed '4s/^/#/g' student.txt 将第4行注释掉
sed -e 's/Liming//g ; s/Tg//g' student.txt 执行多个命令 使用 -e参数

4.sort命令

4.1命令格式

sort [选项] 文件名 选项:
-f:	忽略大小写
-b:	忽略每行前面的空白部分
-n:	以数值型进行排序,默认使用字符串型排序
-r:	反向排序
-u:	删除重复行。就是 uniq 命令
-t:	指定分隔符,默认是分隔符是制表符
-k n[,m]:  按照指定的字段范围排序。从第 n 字段开始,m 字段结束(默认到行尾)

  4.2测试样例

sort /etc/passwd  #排序用户信息文件
sort -r /etc/passwd  #反向排序
sort -t ":" -k 3,3 /etc/passwd 使用:分割每行,并用第三个字段排序
sort -n -t ":" -k 3,3 /etc/passwd 将第三个字段转为数值再排序

uniq
uniq 命令是用来取消重复行的命令,其实和“sort -u”选项是一样的。命令格式如下:
[root@localhost ~]# uniq [选项] 文件名 选项:
-i:	忽略大小写

统计命令 wc
[root@localhost ~]# wc [选项] 文件名 选项:
-l:	只统计行数
-w:	只统计单词数
-m:	只统计字符数

 

你可能感兴趣的:(linux运维)