shell工具之cutsed命令

Posted 爱上口袋的天空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell工具之cutsed命令相关的知识,希望对你有一定的参考价值。

1、cut

cut命令从文件的每一行剪切字节,字符和字段并将这些字节,字符和字段输出

cut [选项参数] filename

  • -f 列号,提取第几列,可以跟多个数字,用逗号隔开
  • -d 分隔符,按照指定分隔符分隔列
  • -c 后面只有一个数字,表示截取第几个字符
# DESC 切割cut.txt第一列
[linux@localhost datas]$ cat cut.txt
dong shen
guan zhen
wo wo
lai lai
le le
[linux@localhost datas]$ cut -d " " -f 1 cut.txt
dong
guan
wo
lai
le

# DESC 获取第三行第一个单词
[linux@localhost datas]$ cat cut.txt | grep guan | cut -d " " -f 1
guan

查看我们的passwd文件:

1.1、使用cut查看第一列的内容:

[dhapp@conch01 shell]$ cut -d : -f  1  passwd    #表示passwd文件的第一列内容
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
systemd-network
dbus
polkitd
rpc
rpcuser
nfsnobody
postfix
chrony
sshd
vagrant
clickhouse
dhapp
ntp
[dhapp@conch01 shell]$

1.2、 截取passwd文件的第一列和第三列内容:

[dhapp@conch01 shell]$ cut -d : -f  1,3  passwd
root:0
bin:1
daemon:2
adm:3
lp:4
sync:5
shutdown:6
halt:7
mail:8
operator:11
games:12
ftp:14
nobody:99
systemd-network:192
dbus:81
polkitd:999
rpc:32
rpcuser:29
nfsnobody:65534
postfix:89
chrony:998
sshd:74
vagrant:1000
clickhouse:997
dhapp:1001
ntp:38
[dhapp@conch01 shell]$

1.3、截取passwd文件第三列及以后的所有内容:

[dhapp@conch01 shell]$ cut -d :  -f   3-   passwd
0:0:root:/root:/bin/bash
1:1:bin:/bin:/sbin/nologin
2:2:daemon:/sbin:/sbin/nologin
3:4:adm:/var/adm:/sbin/nologin
4:7:lp:/var/spool/lpd:/sbin/nologin
5:0:sync:/sbin:/bin/sync
6:0:shutdown:/sbin:/sbin/shutdown
7:0:halt:/sbin:/sbin/halt
8:12:mail:/var/spool/mail:/sbin/nologin
11:0:operator:/root:/sbin/nologin
12:100:games:/usr/games:/sbin/nologin
14:50:FTP User:/var/ftp:/sbin/nologin
99:99:Nobody:/:/sbin/nologin
192:192:systemd Network Management:/:/sbin/nologin
81:81:System message bus:/:/sbin/nologin
999:997:User for polkitd:/:/sbin/nologin
32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
89:89::/var/spool/postfix:/sbin/nologin
998:996::/var/lib/chrony:/sbin/nologin
74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
1000:1000:vagrant:/home/vagrant:/bin/bash
997:995::/nonexistent:/bin/false
1001:1001::/home/dhapp:/bin/bash
38:38::/etc/ntp:/sbin/nologin
[dhapp@conch01 shell]$

1.4、截取passwd文件第三列到第五列的内容

[dhapp@conch01 shell]$ cut -d :  -f   3-5  passwd
0:0:root
1:1:bin
2:2:daemon
3:4:adm
4:7:lp
5:0:sync
6:0:shutdown
7:0:halt
8:12:mail
11:0:operator
12:100:games
14:50:FTP User
99:99:Nobody
192:192:systemd Network Management
81:81:System message bus
999:997:User for polkitd
32:32:Rpcbind Daemon
29:29:RPC Service User
65534:65534:Anonymous NFS User
89:89:
998:996:
74:74:Privilege-separated SSH
1000:1000:vagrant
997:995:
1001:1001:
38:38:
[dhapp@conch01 shell]$

1.5、截取passwd文件前面一直到第三列的内容

[dhapp@conch01 shell]$ cut -d :  -f  -3  passwd
root:x:0
bin:x:1
daemon:x:2
adm:x:3
lp:x:4
sync:x:5
shutdown:x:6
halt:x:7
mail:x:8
operator:x:11
games:x:12
ftp:x:14
nobody:x:99
systemd-network:x:192
dbus:x:81
polkitd:x:999
rpc:x:32
rpcuser:x:29
nfsnobody:x:65534
postfix:x:89
chrony:x:998
sshd:x:74
vagrant:x:1000
clickhouse:x:997
dhapp:x:1001
ntp:x:38
[dhapp@conch01 shell]$

1.6、-c ##指定截取的字符,数字用法与-f相同

[dhapp@conch01 shell]$ cut -c 1-4 passwd
root
bin:
daem
adm:
lp:x
sync
shut
halt
mail
oper
game
ftp:
nobo
syst
dbus
polk
rpc:
rpcu
nfsn
post
chro
sshd
vagr
clic
dhap
ntp:
[dhapp@conch01 shell]$

2、sed

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

sed的优点:sed速度快,在启动vim的时间,sed已经完成了需要执行的操作

sed [选项参数] ‘command’ filename

  • -e 直接在指令列模式上进行sed的动作编辑

命令功能描述

  • a 新增
  • d 删除
  • s 查找并替换
# DESC 在第二行后增加mei nv字符
[linux@localhost datas]$ sed -e "2a mei nv" sed.txt
dong zhen
guan zhen
mei nv
wo wo
lai lai

2.1、标记替换

s/要替换的部分/替换成的部分

echo "This is a test" | sed 's/test/testing/'

对于整个文件进行替换:

sed 's/dog/tiger/' test1

 

 2.2、 指定行替换

sed '2s/dog/tiger/' test1			#指定替换第二行
sed '4s/dog/tiger/' test1			#指定替换第四行
sed '2,4s/dog/tiger/' test1			#指定替换第2到4行
sed '2,$s/dog/tiger/' test1			#指定替换第二行到最后
[root@node2 sed]# sed '2			#多个要求替换第二行
> s/dog/tiger/
> s/white/red/
> s/cat/ribbit/
> ' test1

2.3、同时进行多个替换 

写法1:

sed -e 's/dog/tiger/;s/cat/ribbit/' test1

写法2:

[root@node2 sed]# sed -e '
> s/white/red/
> s/dog/tiger/
> s/cat/ribbit/' test1

 

2.4、使用文件中指定命令替换另一文件

-f 命令文件 要替换的文件 

sed -f file test1

2.5、当每句中含有多个要替换的关键字时

不加任何参数时默认替换每句中出现第一次的关键字: 

sed 's/test/trial/' test2

加上g参数时替换所有出现的关键字:

sed 's/test/trial/g' test2

 

加具体的num参数,替换每句中出现第n次的关键字:

sed 's/test/trial/2' test2

 

2.6、参数p和-n:显示

p显示指定句,通常和-n搭配使用;-n:默认不显示所有内容

sed -n 's/test/trial/p' test3		#只显示修改部分
sed -n 's/number/num/' test4		#使用-n而不使用p参数时,不会有显示
sed -n '/number3/p' test4			#显示匹配到的含有number3的行
sed -n '2,4p' test4					#显示2到4行

 

2.7、参数w:写入文件 

将指定部分写入文件

sed 's/test/trial/w test' test3	#将修改的句子写入test文件
sed '1,2w test' test4			#将1到2行写入test文件

2.8、要替换部分中含有/符号时的解决 

- 方法1:用\\转义符号进行转义

 sed 's/\\/bin\\/bash/\\/bin\\/csh/' passwd
[dhapp@conch01 shell]$ sed 's/\\/bin\\/bash/\\/bin\\/csh/' passwd
root:x:0:0:root:/root:/bin/csh
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
vagrant:x:1000:1000:vagrant:/home/vagrant:/bin/csh
clickhouse:x:997:995::/nonexistent:/bin/false
dhapp:x:1001:1001::/home/dhapp:/bin/csh
ntp:x:38:38::/etc/ntp:/sbin/nologin
[dhapp@conch01 shell]$

- 方法2:将修改格式中的/改为!

sed 's!bin/bash!bin/csh!' passwd
[dhapp@conch01 shell]$ sed 's!bin/bash!bin/csh!' passwd
root:x:0:0:root:/root:/bin/csh
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
vagrant:x:1000:1000:vagrant:/home/vagrant:/bin/csh
clickhouse:x:997:995::/nonexistent:/bin/false
dhapp:x:1001:1001::/home/dhapp:/bin/csh
ntp:x:38:38::/etc/ntp:/sbin/nologin
[dhapp@conch01 shell]$

- 方法3:将修改格式中的/改为#

sed 's#bin/bash#bin/csh#' passwd

 2.9、参数d:删除

sed 'd' test4				#删除全部
sed '2d' test4				#删除第二行
sed '4d' test4				#删除第四行
sed '2,4d' test4			#删除第2到4行
sed '2,$d' test4			#删除第二行到结束的行

应用正则表达式:

2.10、参数i和a:插入和追加

echo 'test 2' | sed 'i\\test 1'	#i表示插入到前面
echo 'test 2' | sed 'a\\test 1'	#a表示追加到末尾

 

sed '3i\\test 1' test4			#插入到第三行前面
sed '3a\\test 1' test4			#追加到第三行后面

 

插入多条:

[root@node2 sed]# sed '1i \\
> new line1.\\
> new line2.\\
> new line3.' test4

 

追加多条:

sed '$a\\This is an inserted line.\\nThis is another inserted line.' test4

 2.11、参数c:修改

- 修改指定行

sed '3c\\new line3.' test4

 

- 修改含有指定信息的行

sed '/number1/c\\new line.' test4

- 修改多行 

sed '2,4c\\new line.' test4

注意:此处的修改多行为同时修改,而不是逐行修改

- 修改指定单个字符 

sed 'y/123/789/' test4

当一行中包含多个要修改的单个字符时,默认全部修改: 

echo "This 1 is a test of 1 try." | sed 'y/123/789/'

2.12、参数r:组合两个文件 

- 添加到指定行后 

sed '3r test5' test4			#将test5添加到test4中第三行后面

- 添加到包含指定信息行的后面

sed '/number2/r test5' test4

以上是关于shell工具之cutsed命令的主要内容,如果未能解决你的问题,请参考以下文章

Shell编程之正则表达式三剑客——sed工具

shell相关知识点

shell编程之sed

性能工具之Jmeter使用shell启动

Linux之基础bash shell命令

sed && awk工具 及一些常用的shell脚本