Linux学习笔记14 sed,locate,find

本文详细介绍了sed命令的基本用法,包括地址、命令格式及其应用实例。此外还介绍了locate命令的使用方法,以及find命令的多种选项和操作示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.sed

默认不编辑原文件,仅对模式控件中的数据做处理

sed ‘AddressCommand’ file…

地址命令格式Address:

  • StartLine,EndLine 例如1,100(1-100行)
    $: 最后一行
    $-1: 倒数第二行
  • /Pattern(RegExp)/ 正则表达式
  • /pattern1/,/pattern2/
    第一次被pattern1匹配到的行开始至第一次被pattern2匹配到的行结束,这中间的所有行
  • LineNumber 指定的行
  • StartLine, +N
    从startLine开始,向后的N行

相关命令Command:

  • d: 删除相关的行
  • p: 显示符合条件的行
  • a \string: 在符合的行后面追加新的行加字符串string(append)
  • i \string: 在符合的行前面追加新的行加字符串string(insert)
  • r FIEL: 将指定文件的内容添加到符合条件的行
  • w FILE: 符合条件的行保存至新的文件中
  • s/pattern/string/修饰符: 匹配模式的字符串换成string
    s@pattern@string@修饰符s#pattern#string#修饰符
    加修饰符:
    g: 全局替换(每一行匹配到第一个字符串后 继续匹配下面的字符串)
    i: 忽略字符大小写
    \(\),\1,\2
    &: 模式匹配到的整个串

选项

  • -n: 不在显示模式空间中的内容
  • -i: 直接修改原文件
  • -e SCRIPT -e SCRIPT: 可以执行多个脚本
  • -f /PATH/TO/SED_SCRIPT: 脚本文件
    • -r: 使用扩展正则表达式

例子

创建文件sed_test,并插入内容

touch sed_test
vim sed_test
1 10 11 12
2
3
4
5
6
7
8
9
10
11

删除第一行:

[root@localhost ~]# sed "1d" sed_test
2
3
4
5
6
7
8
9
10
11

删除第一到第九行:

[root@localhost ~]# sed "1,9d" sed_test
10
11

删除以1开头的行

[root@localhost ~]# sed "/^1/d" sed_test
2
3
4
5
6
7
8
9

前4行加入hello head four lines文字:

[root@localhost ~]# sed "1,4a\hello head four lines" sed_test
1 10 11 12
hello head four lines
2
hello head four lines
3
hello head four lines
4
hello head four lines
5
6
7
8
9
10
11

在第二行前插入文字line2 insert:

[root@localhost ~]# sed "2i \line2 insert" sed_test
1 10 11 12
line2 insert
2
3
4
5
6
7
8
9
10
11

从文件中读取内容追加到某某行:

[root@localhost ~]# sed "1,3r /root/.vimrc" sed_test
1 10 11 12
syntax on
set number
2
syntax on
set number
3
syntax on
set number
4
5
6
7
8
9
10
11

把文件前5行内容写入文件sed_test_head_5_content中去

[root@localhost ~]# sed -n "1,5w sed_test_head_5_content" sed_test
[root@localhost ~]# cat sed_test_head_5_content
1 10 11 12
2
3
4
5

文件中所有的1替换成one

[root@localhost ~]# sed "s/1/one/" sed_test
one 10 11 12
2
3
4
5
6
7
8
9
one0
one1

发现没加修饰符g时 每行只替换了第一个1成one,加入g修饰符选项测试

[root@localhost ~]# sed "s/1/one/g" sed_test
one one0 oneone one2
2
3
4
5
6
7
8
9
one0
oneone

把所有以1开始的两位数修改成9开始的数字

[root@localhost ~]# sed "s#1\([0-9]\)#9\1#g" sed_test
1 90 91 92
2
3
4
5
6
7
8
9
90
91

把所有以1开始的两位数追加0

[root@localhost ~]# sed "s#1[0-9]#&0#g" sed_test
1 100 110 120
2
3
4
5
6 
7
8
9
100
110

2.locate

locate命令用于查找文件,它比find命令的搜索速度快,它需要一个数据库,这个数据库由每天的例行工作(crontab)程序来建立。当我们建立好这个数据库后,就可以方便地来搜寻所需文件了。
即先运行:updatedb(无论在那个目录中均可,可以放在crontab中 )后在 /var/lib/slocate/ 下生成 slocate.db 数据库即可快速查找。在命令提示符下直接执行#updatedb 命令即可:

例子

查询关键字issue

[root@localhost ~]# locate issue
/etc/issue
/etc/issue.net
/etc/pki/tls/misc/c_issuer
/lib64/security/pam_issue.so
/usr/share/doc/docbook-dtds-1.0/3.0-sgml/40issues.txt
/usr/share/doc/docbook-dtds-1.0/3.1-sgml/40issues.txt
/usr/share/doc/docbook-dtds-1.0/3.1-sgml/50issues.txt
/usr/share/doc/docbook-dtds-1.0/4.0-sgml/50issues.txt
/usr/share/doc/docbook-dtds-1.0/4.1-sgml/50issues.txt
/usr/share/doc/pam-1.1.1/html/sag-pam_issue.html
/usr/share/doc/pam-1.1.1/html/sag-security-issues-other.html
/usr/share/doc/pam-1.1.1/html/sag-security-issues-wrong.html
/usr/share/doc/pam-1.1.1/html/sag-security-issues.html
/usr/share/doc/pam-1.1.1/txts/README.pam_issue
/usr/share/man/fr/man5/issue.5.gz
/usr/share/man/fr/man5/issue.net.5.gz
/usr/share/man/man5/issue.5.gz
/usr/share/man/man8/pam_issue.8.gz
/usr/share/man/overrides/ru/man5/issue.5.gz

/tmp创建新的空文件myissue:

[root@localhost ~]# touch /tmp/myissue

查询myissue:

[root@localhost ~]# locate myissue

3.find 查询搜索文件

选项

  • -name: 文件名精确匹配
    文件通配符:
    • *: 匹配文件名中的任何字符串,包括空字符串
    • ?: 匹配文件名中的任何单个字符
    • [...] 匹配[ ]中所包含的任何字符。
    • [!...] 匹配[ ]中非感叹号!之后的字符。
  • iname FILENAME: 文件名匹配时不区分大小写
  • regex PATTERN: 基于正则表达式进行文件名匹配
  • user USERNAME: 根据属主查找
  • group GROUPNAME: 根据属组查找
  • uid UID: 根据UID查找 防止用户删除后 用户创建的文件残留
  • gid GID: 根据GID查找
  • -nousr: 查询没有属主的文件
  • -nogroup: 查询没有属组的文件
  • -type :
    • f: 普通文件
    • d:
    • c:
    • b:
    • l:
    • p:
    • s:
  • -size:
    [+|-]#k: +表示大于 -表示小于 不带+-就是精确等于
    #M
    #G
  • mtime: modify time
  • atime: access time
  • ctime: change time
  • amin:
  • mmin:
  • cmin:
  • perm MODE: 按照权限查找
    /MODE: 有一位匹配就行
    -MODE: 文件权限完全包含此MODE时才能显示

组合条件
- -a: 与
- -o: 或
- -not: 非

操作

  • -ls: ls -la效果
  • -print: 显示
  • ok COMMAND {} \;: 每次操作用户需要要确认
  • -exec COMMAND {} \;:

例子

查询/etc/下以wd结尾的文件

[root@localhost tmp]# find /etc/ -name "*wd"
/etc/pam.d/passwd
/etc/security/opasswd
/etc/passwd

插入用户user1,user2,user3,user4,user10

[root@localhost home]# useradd user1
[root@localhost home]# useradd user2
[root@localhost home]# useradd user3
[root@localhost home]# useradd user4
[root@localhost home]# useradd user10

查询/home下user#(#表示单个数字)

方法一 通配符:
[root@localhost home]# find /home -name "user[0-9]"
/home/user4
/home/user3
/home/user1
/home/user2
方法二 正则表达式:
[root@localhost home]# find /home -regex "/home/user[0-9]"
/home/user4
/home/user3
/home/user1
/home/user2

查询/home下user#(#表示两个数字)

[root@localhost home]# find /home -regextype posix-extended -regex "/home/user[0-9]{2}"
/home/user10

搜索/home下属主和属组都是user1的目录

[root@localhost home]# find /home/ -user user1 -group user1 -type d -maxdepth 1
/home/user1

搜索大于100M的文件

[root@localhost home]# find / -size +100M
/sys/devices/pci0000:00/0000:00:0f.0/resource1
/sys/devices/pci0000:00/0000:00:0f.0/resource1_wc
find: `/proc/13572/task/13572/fd/5': No such file or directory
find: `/proc/13572/task/13572/fdinfo/5': No such file or directory
find: `/proc/13572/fd/5': No such file or directory
find: `/proc/13572/fdinfo/5': No such file or directory
/usr/share/icons/oxygen/icon-theme.cache

搜索/tmp下30天没有访问的文件了

[root@localhost home]# find /tmp/ -atime +30
/tmp/gnome-system-monitor.qkong.1536000305
/tmp/pulse-xFHzwQuYARSH/native
/tmp/.esd-500/socket

查询/home下user#(#表示单个数字)的详情信息

find /home -name "user[0-9]" -ls
396513    4 drwx------   4 user4    user4        4096 Mar  4 21:59 /home/user4
396505    4 drwx------   4 user3    user3        4096 Mar  4 21:59 /home/user3
391793    4 drwx------   4 user1    user1        4096 Mar  2 06:10 /home/user1
396489    4 drwx------   4 user2    user2        4096 Mar  2 06:10 /home/user2

查询/home下user#(#表示单个数字) 给组用户加入rw权限

[root@localhost home]# find /home -name "user[0-9]" -exec chmod g+rw {} \;
[root@localhost home]# find /home -name "user[0-9]" -ls
396513    4 drwxrw----   4 user4    user4        4096 Mar  4 21:59 /home/user4
396505    4 drwxrw----   4 user3    user3        4096 Mar  4 21:59 /home/user3
391793    4 drwxrw----   4 user1    user1        4096 Mar  2 06:10 /home/user1
396489    4 drwxrw----   4 user2    user2        4096 Mar  2 06:10 /home/user2

查询/usr目录下不属于root,bin和student的文件:

[root@localhost home]# find /usr -not -user root -not -user bin -not -user student
/usr/libexec/abrt-action-install-debuginfo-to-abrt-cache
[root@localhost home]# find /usr -not \( -user root -o -user bin -o -user student \)
/usr/libexec/abrt-action-install-debuginfo-to-abrt-cache

SUID,SGID,Sticky

SUID: 运行某程序时,相应进程的属主是程序文件自身的属主,而不是启动者
chmod u+s FILE
chmod u-s FILE
SGID: 1. 运行某程序时,相应进程的属主是程序文件自身的属组,而不是启动者
2. 创建的文件默认组为该目录的默认组
chmod g+s FILE
Sticky:

例子

1.SUID

qkong非root用户用cat文件查看/etc/shadow内容:

查看/etc/shadow权限发现只有root用户才能查看内容
[root@localhost tmp]# ls -l /etc/shadow
----------. 1 root root 1536 Mar  4 22:15 /etc/shadow
为/bin/cat加上SUID权限
[root@localhost tmp]# chmod u+s /bin/cat
[root@localhost tmp]# ls -l /bin/cat
-rwsr-xr-x. 1 root root 48568 May 11  2016 /bin/cat

切换用户为qkong 查看/etc/shadow内容 查看成功:

[root@localhost tmp]# su - qkong
Hello qkong, Today is Sun Apr  9 01:38:44 CST 2017
[qkong@localhost ~]$ cat /etc/shadow
root:$6$9Wg485c2BD9T1qOe$mO7dCwPDeQHos6BA80HGhixBNY7mHR06E1YNCgJ9az52yFDHaRtpudAYjpTCWXd9tnmE6JpmKvju.3W0YXaRW0:17113:0:99999:7:::
bin:*:15980:0:99999:7:::
daemon:*:15980:0:99999:7:::
....
2.SGID

删除/bin/cat的SUID权限,加入SGID权限:

[root@localhost tmp]# chmod u-s /bin/cat
[root@localhost tmp]# ls -l /bin/cat
-rwxr-xr-x. 1 root root 48568 May 11  2016 /bin/cat
[root@localhost tmp]# chmod g+s /bin/cat
[root@localhost tmp]# ls -l /bin/cat
-rwxr-sr-x. 1 root root 48568 May 11  2016 /bin/cat

qkong用户加入到root用户组中:

[root@localhost tmp]# usermod -a -G root qkong
[root@localhost tmp]# id qkong
uid=500(qkong) gid=500(qkong) groups=500(qkong),0(root)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值