Linux学习基础命令(三)


find

  • 查找命令,可以根据类型查找文件
  • 用法:find [选项] [查找路径] [查找标准] [查找到以后的处理动作]
    • 选项:
      • -name filename 对文件名精确匹配,支持通配符
      • -iname filename 文件名匹配时不区分大小写
      • -user 查找某用户的所有文件
      • -group 查找某组的所有文件
      • -uid 根据UID进行查找
      • -gid 根据GID进行查找
      • -nouser 查找没有拥有者的文件
      • -nogroup 查找没有属组的文件
      • -type 根据文件类型进行查找
      • -size 根据文件大小进行查找。如1M、+10k、-10M
        • +表示大于,-表示小于,不加的表示等于
      • -mtime 根据修改时间查找
      • +5 表示查找5天以前修改的文件
      • -5 表示查找5天以内修改的文件
      • -atime 根据访问时间查找
      • -ctime 根据改变时间查找
      • -perm mode 根据权限精确查找
      • -perm –mode 文件权限能完全包含此mode时才符合条件
      • -perm /mode 9位权限中有任何一位权限匹配都视为符合查找条件
      • -print 打印到屏幕上
      • -ls 类似ls –l的形式显示每一个文件的详细信息
      • -delete 删除查找到的文件
      • -fls /path/to/somefile 将查找到的所有文件的长格式信息保存至指定文件中
      • -ok COMMAND {} ; 对查找到的所有文件执行某一个命令,每次操作都需要用户确认
      • -exec COMMAND {} ; 对查找到的所有文件执行某一个命令,操作不需要确认
      • -regex pattern 基于正则表达式进行文件名匹配
[root@bad test]# find -name bad  //在当前目录下查找bad
./bad
[root@bad test]# find /etc/ -name passwd  //在/etc/目录下查找passwd
/etc/passwd
/etc/pam.d/passwd
[root@bad test]# find -iname a  /忽略大小写在当前目录下查找a
./a
./A
[root@bad test]# find /home/ -user jay | head -3  //在/home目录下查找属于用户jay的文件,仅查看前三行
/home/jay
/home/jay/.mozilla
/home/jay/.mozilla/extensions
[root@bad test]# find /home/ -nouser  -exec rm -rf {} ;  //查找/home/目录下没有属主的文件,并且删除
[root@bad test]# find /home/ -uid 1000  //在/home/目录下查找uid为1000的文件
[root@bad test]# find /root/test/ -type f  //查找的类型是文件
/root/test/5
/root/test/6
/root/test/7
/root/test/8
[root@bad test]# find /root/test/ -type d  //查找的类型是目录
/root/test/
/root/test/1
/root/test/2
/root/test/3
/root/test/4
[root@bad test]# find -size +1k  //在当前目录下查找大于1k的文件
.
./anaconda-ks.cfg
./passwd
[root@bad test]# find -size -1k  //在当前目录下查找小于1k的文件
./5
./6
./7
[root@bad test]# find -mmin -5  //在当前目录下查找5分钟以内创建的文件
[root@bad test]# find -mmin +10  //在当前目录下查找10分钟以前创建的文件
[root@bad test]# ll
total 12
drwxr-xr-x. 2 root root    6 Nov  3 00:04 1
drwxr-xr-x. 2 root root    6 Nov  3 00:04 2
drwxr-xr-x. 2 root root    6 Nov  3 00:04 3
drwxr-xr-x. 2 root root    6 Nov  3 00:04 4
-rw-r--r--. 1 root root    0 Nov  3 00:10 5
-rw-r--r--. 1 root root    0 Nov  3 00:10 6
-rw-r--r--. 1 root root    0 Nov  3 00:10 7
-rw-------. 1 root root 1196 Nov  3 00:08 anaconda-ks.cfg
-rw-r--r--. 1 root root  293 Nov  3 00:08 ifcfg-eno16777736
-rw-r--r--. 1 root root 1905 Nov  3 00:08 passwd
[root@bad test]# find -perm 644  //在当前目录下查找权限为644的文件
./passwd
./ifcfg-eno16777736
./5
./6
./7
[root@bad test]# find -perm 644 -type f  //在当前目录下查找权限为644且类型为文件
[root@bad test]# find -type f -perm 644 -ls  //在当前目录下查找权限为644的文件并列出
71511020    4 -rw-r--r--   1 root     root         1905 Nov  3 00:08 ./passwd
71511021    4 -rw-r--r--   1 root     root          293 Nov  3 00:08 ./ifcfg-eno16777736
71511012    0 -rw-r--r--   1 root     root            0 Nov  3 00:10 ./5
71511015    0 -rw-r--r--   1 root     root            0 Nov  3 00:10 ./6
71511016    0 -rw-r--r--   1 root     root            0 Nov  3 00:10 ./7
[root@bad test]# find -type f -perm 644 -delete  //在当前目录下查找权限为644的文件并删除
[root@bad test]# ls
1  2  3  4  anaconda-ks.cfg
[root@bad test]# find -type d -ok rm -rf {} ;  //在当前目录下查找类型为目录的文件,并删除,提示用户确认
< rm ... . > ? y
rm: refusing to remove ‘.’ or ‘..’ directory: skipping ‘.’
< rm ... ./1 > ? y
find: ‘./1’: No such file or directory
< rm ... ./2 > ? y
find: ‘./2’: No such file or directory
< rm ... ./3 > ? y
find: ‘./3’: No such file or directory
< rm ... ./4 > ? y
find: ‘./4’: No such file or directory
[root@bad test]# ls
anaconda-ks.cfg
[root@bad test]# ls
1  2  3  4  anaconda-ks.cfg
[root@bad test]# find -type d -exec rm -rf {} ;  //在当前目录下查找类型为目录的文件,并删除,不提示用户确认
rm: refusing to remove ‘.’ or ‘..’ directory: skipping ‘.’
find: ‘./1’: No such file or directory
find: ‘./2’: No such file or directory
find: ‘./3’: No such file or directory
find: ‘./4’: No such file or directory
[root@bad test]# ls
anaconda-ks.cfg
[root@bad test]# find -type f | xargs rm -rf  //在当前目录下查找类型为普通文件,并删除;不能用于文件过多的删除

在使用ls命令时,我们所看到的详细信息中,第一个字符就代表着文件类型,-表示的是文件。

  • f 普通文件
  • d 目录
  • s 套接字
  • l 链接文件
  • b 块设备
  • c 字符设备

grep

  • 过滤
  • 用法:grep [选项]
    • 选项:
    • -i 忽略大小写
    • -v 显示没有被正则表达式匹配到的内容
    • -o 只显示被正则表达式匹配到的内容
    • -E 使用扩展正则表达式
    • -q 静默模式,不输出任何信息
    • -A # 此处的#必须是数字。被正则匹配到的内容以及其后面#行的内容都显示出来
    • -B # 此处的#必须是数字。被正则匹配到的内容以及其前面#行的内容都显示出来
    • -C # 此处的#必须是数字。被正则匹配到的内容及其前后各#行的内容都显示出来
[root@bad test]# ls
abc  Abc  ABC  passwd  bad
[root@bad test]# ls | grep abc
abc
[root@bad test]# ls | grep Abc
Abc
[root@bad test]# ls | grep '[aA]bc'
abc
Abc
[root@bad test]# ls | grep 'abc'
abc
[root@bad test]# ls | grep -i 'abc'  //过滤忽略大小写的abc
abc
Abc
ABC
[root@bad test]# ls | grep '^abc$'
abc
[root@bad test]# ls | grep -E '(a|A)bc'
abc
Abc
abcd
[root@bad test]# ls | grep -E '^(a|A)bc$'
abc
Abc
[root@bad test]# ls | grep '(a|A)bc'
abc
Abc
abcd
t@bad test]# head -5 passwd 
bad:x:0:0:bad:/bad:/bin/bash
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
[root@bad test]# grep '^daemon' passwd  //过滤出以daemon开头的行
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@bad test]# grep -A2 '^daemon' passwd  //过滤出以daemon开头的行的后两行和本身
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
[root@bad test]# grep -B1 '^daemon' passwd  //过滤出以daemon开头的行的前一行和本身
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@bad test]# grep -C1 '^daemon' passwd  //过滤出以daemon开头的行的前一行后一行和本身
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
[root@bad test]# ls | grep '^a.c$'  //过滤出a_c的文件
abc
[root@bad test]# ls | grep '^[0-9]$'  //过滤出0-9的文件
1
2
3
4
5
6
7
8
9
[root@bad test]# ls | grep '^1*$'  //过滤出*号前的字符出现任意次的文件
1
11
111
1111
[root@bad test]# ls | grep '^1.*$'  //.表示任意单个字符,*表示前面一个字符的任意次
1
10
11
111
1111
12
13
14
15
16
17
18
19


[root@bad test]# ls | grep '^1+$'  //匹配前字符的任意次数,作用与*相同
1
11
111
1111
[root@bad test]# ls | grep '^1{3}$'  //匹配1出现3次的文件
111
[root@bad test]# ls | grep '^1{1,3}$'  //匹配1出现至少一次至多三次的所有文件
1
11
111
[root@bad test]# ls | grep '^1{1,}$'  //匹配1出现至少一次,至多无限次的文件
1
11
111
1111
[root@bad test]# ls | grep '^1{0,1}$'  //匹配1出现至少次,至多1次的文件
1
[root@bad test]# 
  • findgrep是两个比较重要的命令,同时他们的选项也会很多,所以需要多用,熟悉每个命令的作用

通配符

有时候我们存储的文件太多了,就不知道自己的东西存在哪里了。只依稀记得是以A开头的PDF文件,那我们要怎么去找呢?这个时候我们就可以用到通配符,帮助我们快速的找到文件了。在Windows中有款软件叫Everything(绝对好用!比Windows自带的搜索快很多倍!),是一款能够快速帮你找到文件的软件,它同样也支持通配符的使用。

  • 文件名通配
    • * 匹配任意长度的任意字符
    • 匹配任意的单个字符
    • [] 匹配指定范围内的任意单个字符
      • [abc],[a-m],[0-9]
[root@bad test]# ls
a  aac  aad  ab  abc  abd  ac  adc  bc  be
[root@bad test]# ls a*  //列出当前目录下所有的以a开头的文件
a  aac  aad  ab  abc  abd  ac  adc
[root@bad test]# ls b*  //列出当前目录下所有的以b开头的文件
bc  be
[root@bad test]# ls a?c  //列出名为a_c格式的文件
aac  abc  adc
[root@bad test]# 
  • 以上是常用的三种通配符,当然还有很多其他的通配符

    • [[:space:]] 表示空白字符
    • [[:punct:]] 表示标点符号
    • [[:lower:]] 表示小写字母
    • [[:upper:]] 表示大写字母
    • [[:alpha:]] 表示大小写字母
    • [[:digit:]] 表示数字
    • [[:alnum:]] 表示数字和大小写字母
    • [^] 匹配指定范围之外的任意单个字符
[root@bad test]# touch {a..z}  //创建a-z的文件
[root@bad test]# ls
a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z
[root@bad test]# touch {A..Z}  //创建A-Z的文件
[root@bad test]# ls
a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z
A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z
[root@bad test]# ls [a-z]  //列出a-z文件
a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z
A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y
[root@bad test]# ls [^a-z]  //列出除了a-z的文件,即取反
Z
[root@bad test]#

重定向与管道

说真的,我在学习这里的时候,是真的迷。感觉很高大上,但奈何自己就是掌握不好,好在经常联系,反复的看相关的资料,最后也算基本掌握。

  • 系统设定:
    * 标准输入 STDIN 用数字0来表示
    * 标准输出 STDOUT 用数字1来表示
    * 标准错误输出 STDERR 用数字2来表示
  • 这里还记得我们之前使用过的echo $?吗?判断上一条命令执行结果是否正确,0表示正确的,其他的数字都表示上一条命令有错误。

I/O重定向

重定向在前面我们也有了解到过,就是使用echo将一段文本内容追加或是覆盖到某一文件中,就使用到了简单的重定向。

  • > 覆盖输出
  • >> 追加输出
  • 2> 重定向错误输出
  • 2>> 追加重定向错误输出
  • &> 覆盖重定向标准输出或错误输出至同一个文件
  • &>> 追加重定向标准输出或错误输出至同一个文件
  • < 输入重定向
[root@bad test]# echo "a b c" > bad  //将a b c追加到文件bad中,覆盖
[root@bad test]# cat bad  //查看文件bad中的文件
a b c
[root@bad test]# echo "1" >> bad  //将1追加到文件bad中,不覆盖
[root@bad test]# echo "2" >> bad  //将2追加到文件bad中,不覆盖
[root@bad test]# echo "3" >> bad  //将3追加到文件bad中,不覆盖
[root@bad test]# cat bad  //查看文件bad中的文件
a b c
1
2
3
  • << Here Document
[root@bad test]# cat > bad <<EOF  //直接在屏幕输入写入文件bad中的内容,EOF保存
> a
> b
> c
> 1
> 2
> EOF
[root@bad test]# cat bad  //查看文件bad中的文件
a
b
c
1
2
  • 最后这种也是我们经常会用到的一种,当文件内容太多,我们不想打开编辑,一句一句的写入又太麻烦,就可以使用这种方法。

管道

  • 将前一个命令的输出作为后一个命令的输入。最后一个命令会在当前shell进程的子shell进程中执行
    • 用法:命令1 | 命令2 | 命令3 | …
[root@bad test]# cat anaconda-ks.cfg | wc -l  //统计文件anaconda-ks.cfg的行数
47
[root@bad test]# cat anaconda-ks.cfg | wc -c  //统计文件anaconda-ks.cfg的单词数
1196
[root@bad test]# cat anaconda-ks.cfg | wc -w  //统计文件anaconda-ks.cfg的字节数
103
[root@bad test]#
  • tee 从标准输入读取数据,输出一份到屏幕上,一份保存到文件
[root@localhost ~]# echo "hello world" | tee /tmp/hello.out
hello world
[root@localhost ~]# cat /tmp/hello.out
hello world
  • 在这里管道符|的前后要不要加空格看个人习惯,我习惯加空格,因为这样看起来更好看

引号的引用

引号的引用跟我们学习的很多编程语言里面的是一样的,这点不难。学到这里的时候,我才第一次知道 ` 这个叫反引号,是用Esc下面的按键打出来的。

  • `` 反引号,键盘左上角Esc下面的键,用于命令替换
  • "" 双引号,弱引用,可以实现变量替换
  • '' 单引号,强引用,不完成变量替换
[root@bad test]# a=5
[root@bad test]# echo "$a"
5
[root@bad test]# echo '$a'
$a
[root@bad test]# echo $a
5
[root@bad test]# 
  • `` =$( ) 反引号语句当作命令执行一遍,再将结果加入到原命令中重新执行;
[root@bad test]# ls bad
1  2  3
[root@bad test]# a=`ls bad`
[root@bad test]# echo $a
1 2 3
[root@bad test]# echo `ls bad`
1 2 3
[root@bad test]# echo $(ls bad)
1 2 3
[root@bad test]#

获取命令帮助

当然,Linux可以说是一个纯命令的操作系统,那么问题就来了,那么多的命令,我怎么能清楚的记得每一个命令的用法呢?那万一我只记得命令,但是急不得它有什么用,或者说是怎么用的,那怎么办呢?这个时候我们就需要获取命令帮助了。

help、man

前面讲到过,在查看命令是内部命令还是外部命令使用type这条命令。

  • 内部命令
    • 用法:help COMMAND
  • 外部命令
    • 用法:COMMAND --help
  • 命令手册
    • 用法:man COMMAND

man是分章节的,以下是每一章节的内容介绍:

1   用户命令(/bin,/usr/bin,/usr/local/bin)
2   系统调用
3   库调用
4   特殊文件(设备文件)
5   文件格式(配置文件 的语法)
6   游戏
7   杂项(Miscellaneous)
8   管理命令(/sbin,/usr/sbin,/usr/local/sbin)
  • man手册注意事项:
    • [] 可选
    • <> 必选
    • ... 可以出现多次
    • | 多选一
    • {} 分组
    • NAME 命令名称及功能简要说明
    • SYNOPSIS 用法说明,包括可用的选项
    • DESCRIPTION 命令功能的详尽说明,可能包括每一个选项的意思
    • OPTIONS 说明每一个选项的意义
    • FILES 此命令相关的配置文件
    • BUGS 报告bug
    • EXAMPLES 使用示例
    • SEE ALSO 另外参照

那么问题来了,进入man手册之后,我们要怎么查阅,怎么翻页怎么退出呢?

  • man翻屏

    • 向后翻一屏 SPACE,也就是空格
    • 向前翻一屏 B
    • 向后翻一行 Enter,回车
    • 向前翻一行 K
  • 查找

    • /KEYWORD 向后查找KEYWORD
    • ?KEYWORD 向前查找KEYWORD
    • n 下一个
    • N 前一个
    • q 退出

组合键

  • Ctrl+A 光标跳转至正在输入的命令行的首部
  • Ctrl+E 光标跳转至正在输入的命令行的尾部
  • Ctrl+W 删除光标之前的单词
  • Ctrl+K 删除从光标到末行的所有字符
  • Ctrl+U 删除从光标到首行的所有字符
  • Ctrl+← 光标跳转到前一个单词词首
  • Ctrl+→ 光标跳转到后一个单词词尾
  • Ctrl+L 清屏,和clear命令等效
  • Ctrl+C 终止前台运行的程序
  • Ctrl+Z 将任务暂停,挂至后台
  • Ctrl+D 在shell中,Ctrl-d表示退出当前shell
  • Ctrl+R 搜索历史命令,利用关键字

在Linux中,使用ping命令时,不会像Windows中一样会自己停下来,必须要使用Ctrl+C终止ping命令。

如果有错误或不详尽的地方,还请留言指出。
本文作者: 坏坏
原文地址:https://www.cnblogs.com/bad5/p/12424299.html