Shell工具使用

1 cut

   cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出

1)基本用法

cut [选项参数] filename

2)选项参数说明

  • -f:列号,提取第几列
  • -d:分隔符,按照指定分隔符分割列
  • -c:指定具体的字符

3)案例实操

数据准备

[mayx@hadoop206 ~]$ vim cut.txt 
[mayx@hadoop206 ~]$ cat cut.txt 
1 hello world 
2 jiansheng libai
3 xingzhe wukong
4 fashi anqila
5 sheshou yuji

a 切割cut.txt 第二列

[mayx@hadoop206 ~]$ cut -d " " -f 2 cut.txt 
hello
jiansheng
xingzhe
fashi
sheshou

b 切割cut.txt第一、第二列

[mayx@hadoop206 ~]$ cut -d " " -f 1,2 cut.txt 
1 hello
2 jiansheng
3 xingzhe
4 fashi
5 shedshou

c 在cut.txt文件中切割出libai

[mayx@hadoop206 ~]$ cat cut.txt | grep "libai" |cut -d " " -f 3
libai

d 选取系统PATH变量值,第2个“:”开始后的路径和第2个开始后的所有路径

[mayx@hadoop206 ~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/module/jdk1.8.0_144
:/opt/module/hadoop-2.7.2/bin:/opt/module/hadoop-2.7.2/sbin:/home/mayx/bin
[mayx@hadoop206 ~]$ echo $PATH | cut -d: -f 2
/bin
[mayx@hadoop206 ~]$ echo $PATH | cut -d: -f 2-
/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/module/jdk1.8.0_144/bin:/opt/modul
doop-2.7.2/bin:/opt/module/hadoop-2.7.2/sbin:/home/mayx/bin

e 切割ifconfig后打印的IP地址

[mayx@hadoop206 ~]$ ifconfig | grep "inet addr" | cut -d: -f 2 | cut -d " " -f 1
192.168.206.206
127.0.0.1

2 sed

  sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出

1)基本用法

sed [选项参数] 'command' filename

2)选项参数说明

  • -e:直接在指令列模式上进行sed的动作编辑,允许对输入数据应用多条sed命令编辑
  • -i:直接 编辑文件
  • -n:一般sed命令会把所有数据都输出到屏幕,如果加入-n选项的话,则会把经过sed命令处理的行输出到屏幕

3)命令功能描述

  • a:追加,在当前行后添加一行或多行
  • d:删除
  • c:行替换,用c后面的字符串替换原来数据行
  • i:插入,在当前行前插入一行或多行
  • p:打印,输出指定的行
  • s:字符串替换,用一个字符串替换另一个字符串。格式为’行范围s/旧字符串/新字符串/g’

4)案例实操一

数据准备

[mayx@hadoop206 ~]$ cat sed.txt 
hello world 
jiansheng libai
xingzhe wukong
fashi anqila
shedshou yuji

a 将“yewang hanxin”插入到sed.txt的第二行

[mayx@hadoop206 ~]$ sed '2a yewang hanxin' sed.txt 
hello world
jiansheng libai
yewang hanxin
xingzhe wukong
fashi anqila
shedshou yuji

b 删除sed.txt文件包含“libai”的行

[mayx@hadoop206 ~]$ sed '/libai/d' sed.txt 
hello world
xingzhe wukong
fashi anqila
shedshou yuji

c 将sed.txt文件中he替换成**

[mayx@hadoop206 ~]$ sed 's/he/**/g' sed.txt 
**llo world
jians**ng libai
xingz** wukong
fashi anqila
s**dshou yuji

d 将sed.txt文件中的第二行删除并将he换成**

[mayx@hadoop206 ~]$ sed -e '2d' -e 's/he/**/g' sed.txt 
**llo world
xingz** wukong
fashi anqila
s**dshou yuji

5)案例实操二

数据准备

[mayx@hadoop206 ~]$ cat sed.txt 
hello world
hi neinv
welcome shagnhai
welcome beijng
go hangkang
go swimming

a 删除:d命令

sed '2d' sed.txt              -- 删除 sed.txt 文件的第二行。
sed '2,$d' sed.txt            -- 删除 sed.txt 文件的第二行到末尾所有行。
sed '$d' sed.txt              -- 删除 sed.txt 文件的最后一行。
sed '/hello/d ' sed.txt        -- 删除 sed.txt 文件所有包含 hello 的行。
sed '/[A-Za-z]/d ' sed.txt    -- 删除 sed.txt 文件所有包含字母的行。

b 整行替换:c命令

sed '2c hello world' sed.txt  -- 将第二行替换成 hello world

c 字符串替换:s命令

sed 's/hello/hi/g' sed.txt        -- 在整行范围内把 hello 替换为 hi。如果没有 g 标记,则只有每行第一个匹配的 hello 被替换成 hi
sed 's/hello/hi/2' sed.txt        -- 此种写法表示只替换每行的第 2 个hello为hi
sed 's/hello/hi/2g' sed.txt       -- 此种写法表示只替换每行的第 2 个以后的 hello 为 hi(包括第 2 个)
sed -n 's/^hello/hi/p' sed.txt    -- (-n) 选项和 p  标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的 hello 被替换成 hi,就打印它
sed -n '2,4p' sed.txt             -- 打印输出 sed.txt 中的第 2 行和第 4sed -n 's/hello/&-hi/gp' sed.txt  -- &符号表示追加一个串到找到的串后
sed -n '5,/^hello/p' sed.txt     -- 打印从第五行开始到第一个包含以 hello 开始的行之间的所有行

3 awk

  一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理

1)基本用法

awk [选项参数] ‘pattern1{action1}  pattern2{action2}...’ filename
pattern:表示AWK在数据中查找的内容,就是匹配模式
action:在找到匹配内容时所执行的一系列命令

2)选项参数说明

  • -F:指定输入文件拆分分隔符
  • -v:赋值一个用户定义变量

3)awk的内置变量

  • FILENAME:文件名
  • NR:已读的记录数
  • NF:浏览记录的域的个数(切割后,列的个数)

4)案例实操

a 搜索passwd文件以root关键字开头的所有行,并输出该行的第7列

[mayx@hadoop206 ~]$ awk -F: '/^root/{print $7}' /etc/passwd
/bin/bash

b 搜索passwd文件以root关键字开头的所有行,并输出该行的第1列和第7列,中间以“,”号分割

[mayx@hadoop206 ~]$ awk -F: '/^root/{print $1","$7}' /etc/passwd
root,/bin/bash

c 只显示/etc/passwd的第一列和第七列,以逗号分割,且在所有行前面添加列名user,shell在最后一行添加"end,/end"

awk -F: 'BEGIN{print "user,shell"} {print $1","$7} END{print "end,/end"}' /etc/passwd
user,shell
root,/bin/bash
bin,/sbin/nologin
daemon,/sbin/nologin
adm,/sbin/nologin
mayx,/bin/bash
end,/end

d 将passwd文件中的用户id增加数值1并输出

[mayx@hadoop206 ~]$ awk -v i=1 -F: '{print $3+i}' /etc/passwd
1
2
3

e 统计passwd文件名,每行的行号,每行的列数

awk -F: '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF}' /etc/passwd
filename:/etc/passwd,linenumber:1,columns:7
filename:/etc/passwd,linenumber:2,columns:7
filename:/etc/passwd,linenumber:3,columns:7
filename:/etc/passwd,linenumber:4,columns:7
filename:/etc/passwd,linenumber:5,columns:7
filename:/etc/passwd,linenumber:6,columns:7

f 切割IP

[mayx@hadoop206 ~]$ ifconfig eth0 | grep "inet addr" | awk -F: '{print $2}' | awk -F " " '{print $1}'
192.168.206.206

g 查询sed.txt中空行所在的行号

[mayx@hadoop206 ~]$ awk '/^$/{print NR}' sed.txt 
4

4 sort

  sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出

1)基本语法

sort(选项)(参数)

2)选项

  • -n:依照数值的大小排序
  • -r:以相反的顺序来排序
  • -t:设置排序时所用的分割字符
  • -k:指定需要排序的列
  • 参数:指定待排序的文件列表

3)案例实操

数据准备

[mayx@hadoop206 ~]$ cat sort.txt 
aa:56:23
bb:23:12
cc:23:09
dd:23:78
df:43:23
rg:17:23

a 按照“:”分割后的第三列倒序排序

[mayx@hadoop206 ~]$ sort -t: -nrk 3 sort.txt 
dd:23:78
rg:17:23
df:43:23
aa:56:23
bb:23:12
cc:23:09

5 常用正则

^word      搜索以 word 开头的。vi/vim 中 ^ 代表一行的开头。
word$      搜索以 word 结尾的。vi/vim 中 $ 代表一行的结尾。
^$         以结尾开头,以开头结尾,表示空行
.          代表且只能代表任意一个字符
\          转义符号,让有特殊身份意义的字符,脱掉马甲,还原原型。例:\. 只代表
           点本身。
*          重复 0 个或多个前面的字符。
.*         匹配所有字符。例:^.* 以任意多个字符开头,.*$以任意多个字符结尾。
[abc]      匹配字符集内的任意一个字符。
[^abc]    匹配不包含 ^ 后的任意字符的内容。中括号里的 ^ 为取反。
a\{n,m\}  重复 n 到 m 次前一个重复的字符。若用 egrep、sed -r 可以去掉斜线。
\{n,\}    重复至少 n 次前一个重复的字符。若用 egrep、sed -r 可以去掉斜线。
\{n\}     重复 n 次前一个重复的字符。若用 egrep、sed -r 可以去掉斜线。
\{,m\}    重复最多 m 次

扩展正则:
+         重复一个或一个以上前面的字符。
?         重复 0 个或一个前面的字符。
|        (或者的意思)用或的方式查找多个符合的字符串。
()        找出括号内的字符串

6 应用

1)统计dd.txt文件的某一行字段的个数,假设字段分隔符为“||”

在这里插入图片描述
在这里插入图片描述

2)将指定内容替换

grep 'hello' -rl --include="test.txt" | xargs sed -i "s/hi/g"

3)将统计csv文件除首行外的字段数

cat  a.csv |awk -F'","' 'NR>1{print NF}' |sort|uniq
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值