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命令的主要内容,如果未能解决你的问题,请参考以下文章