Linux基础命令(三),相当于egrep[r


Linux基础命令(三)

目录
  • Linux基础命令(三)
    • 1.Linux文件命名规则
    • 2.文本查找——grep
    • 3.文件查找——find
      • 3.1 查找标准
      • 3.2 处理动作
      • 3.3 组合条件
    • 4. 文件层级系统
    • 5.重定向与管道服
      • 5.1 系统设定
      • 5.2 I/O重定向
      • 5.3 管道符
      • 5.4 tee
    • 6.bash字符处理
      • 6.1 截取变量的字符串
      • 6.2 字符串切片
      • 6.3 取字符串最右侧几个字符(自右向左)
      • 6.4 查找替换
      • 6.5 查找并删除
      • 6.6 字符大小写转换

1.Linux文件命名规则

  • 长度不能超过255个字符
  • 不能使用/当文件名
  • 严格区分大小写

2.文本查找——grep

语法:grep [option...] '关键字' file
根据模式搜索文本,并将符合模式的文本显示出来

[root@zzd ~]# grep zzd greptest 		//过滤greptest文件里zzd关键字
hello zzd

-i 忽略大小写

[root@zzd ~]# grep -i zzd greptest 		//过滤greptes文件里zzd关键字,忽略大小写
hello zzd
heLLo Zzd

--color 将匹配到的内容高亮显示(color命令默认的命令别名带有此选项)

[root@zzd ~]# which grep		//查看命令grep的绝对路径
alias grep='grep --color=auto'
	/usr/bin/grep

-v 显示没有被模式匹配到的行

[root@zzd ~]# grep -v zzd greptest 		//过滤greptes文件里没有zzd关键字的行
Hello Word!
Hello ZIC
Hello zic
Hello tgg
heLLo Zzd

-o 只显示被匹配到的字符串

[root@zzd ~]# grep -o zic greptest 		//只显示匹配到的字符串zic
zic

-E 使用正则表达式。相当于egrep

[root@zzd ~]# grep -E 'hello|zic' greptest 		//使用正则表达式匹配有hello和zic的行
hello zzd
Hello zic

[root@zzd ~]# grep 'hello\|zic' greptest 		//也是正则表达式的用法,不加-E
hello zzd
Hello zic

-q 静默输出,不输出任何信息

[root@zzd ~]# grep  Hello greptest 
Hello Word!
Hello ZIC
Hello zic
Hello tgg
[root@zzd ~]# grep -q Hello greptest 		//静默输出,一般用于shell脚本语言
[root@zzd ~]#

-A 1 显示被匹配到的内容以及前一行,如果把1换成2,就表示前两行

[root@zzd ~]# grep -A 1 tgg greptest 		//过滤关键字tgg,并显示其以及其后一行
Hello tgg
heLLo Zzd

-B 1 显示被匹配的内容以及后一行,如果把1换成2,就表示后两行

[root@zzd ~]# grep -B 1 tgg greptest 		//过滤关键字tgg,并显示其以及其前一行
Hello zic
Hello tgg

-C 1 显示被匹配到的内容以及前后各一行,如果把1换成2则表示前后各两行

[root@zzd ~]# grep -C 1 tgg greptest 		//过滤关键字tgg,并显示其以及其前后各一行
Hello zic
Hello tgg
heLLo Zzd

fgrep 不支持正则表达式,执行速度快,但一般很少用到

egrep 使用正则表达式,和grep -E一个效果

3.文件查找——find

实时查找,精确性强,遍历指定目录中的所有文件完成查找
语法: find [选项...] 查找路径 查找标准 查找到以后的处理动作
查找路径:默认为当前目录
查找标准:默认为指定路径下的所有文件

3.1 查找标准

-name 'filename' 对文件名做精确查找,支持通配符

[root@zzd ~]# find -name greptest		//在当前目录查找文件名为greptest的文件
./greptest

-iname 'filename' 文件名匹配时不区分大小写

[root@zzd ~]# find -iname abc		//在当前目录查找文件名为abc的目录,忽略大小写
./ABC
./abc
./a/ABC
./a/Abc
./a/ABc
./a/abc
[root@zzd ~]# find ./a -iname 'ab*'		//使用通配符查找/root/a目录下以ab开头的文件
./a/ABC
./a/Abc
./a/ABc
./a/abc

-user username 根据属主来查找

[root@zzd ~]# useradd zzd		//创建一个普通用户zzd
[root@zzd ~]# tail -1 /etc/passwd
zzd:x:1001:1001::/home/zzd:/bin/bash		#UID和GID都为1001
[root@zzd ~]# chown zzd:zzd greptest 		//修改文件greptest的属主和属组都为zzd
[root@zzd ~]# ll greptest 
-rw-r--r--. 1 zzd zzd 62 Jul  4 22:57 greptest
[root@zzd ~]# find -user zzd 		//查找属主为zzd的文件
./greptest

-group groupname 根据属组来查找

[root@zzd ~]# find -group zzd 		//查找属组为zzd的文件
./greptest

-uid 根据UID进行查找,当用户被删除后文件的属主会变成此用户的UID

[root@zzd ~]# find -uid 1001 		//查找属主uid为1001的文件
./greptest

-gid 根据GIDj进行查找,当用户或组被删除后文件的属组会变成此用户或组的GID

[root@zzd ~]# find -gid 1001 		//查找属组gid为1001的文件
./greptest

-nouser 查找没有属主的文件,用户被删除的情况下产生的文件,只有uid没有属主

[root@zzd ~]# userdel -r zzd		//删除用户zzd
[root@zzd ~]# find -nouser			//查找只有uid没有属主的文件
./greptest

-nogroup 查找没有属组的文件,组被删除的情况下产生的文件,只有gid没有属组

[root@zzd ~]# find -nogroup			//查找只有gid没有属组的文件
./greptest

-type 根据文件类型来查找(f , d , c , l , p , s)

[root@zzd ~]# find -type f		//查找当前目录下所有文件
./.bash_logout
./.bash_profile
./.cshrc
./.tcshrc
./.bash_history
./002
./qwer
./ABC
./.viminfo
./greptest
./.bashrc
./anaconda-ks.cfg
./passwd
./abc
./.lesshst
./a/ABC
./a/Abc
./a/ABc
./a/abc

-size 根据文件大小来查找,如1k,1M,+10k,+10M,-1k,-1M

[root@zzd ~]# find / -size 15M 			//查找根目录下大小为15M的文件
find: ‘/proc/1465/task/1465/fd/6’: No such file or directory
find: ‘/proc/1465/task/1465/fdinfo/6’: No such file or directory
find: ‘/proc/1465/fd/5’: No such file or directory
find: ‘/proc/1465/fdinfo/5’: No such file or directory
/mnt/AppStream/Packages/bcc-0.16.0-1.el8.x86_64.rpm
/mnt/AppStream/Packages/gimp-2.8.22-15.module_el8.0.0+36+bb6a76a2.x86_64.rpm
/mnt/AppStream/Packages/golang-race-1.15.2-1.module_el8.4.0+546+c69f460d.x86_64.rpm
/mnt/AppStream/Packages/libkkc-data-0.2.7-12.el8.x86_64.rpm
/mnt/AppStream/Packages/python2-scipy-1.0.0-20.module_el8.4.0+543+a968257c.x86_64.rpm
/mnt/AppStream/Packages/python3-scipy-1.0.0-20.module_el8.3.0+389+6a62c88d.x86_64.rpm
/mnt/AppStream/Packages/texlive-lm-20180414-19.el8.noarch.rpm
/mnt/AppStream/Packages/texlive-oberdiek-20180414-19.el8.noarch.rpm
/mnt/AppStream/Packages/wireshark-cli-2.6.2-12.el8.i686.rpm


[root@zzd ~]# find /etc/ -size -1M		//查找/etc目录下大小1M及以内的文件,+1M则是大于1M的文件
/etc/crypttab
/etc/security/opasswd
/etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem
/etc/environment
/etc/exports
/etc/motd
/etc/sysconfig/run-parts
/etc/cron.deny
/etc/kernel/install.d/20-grubby.install
/etc/kernel/install.d/90-loaderentry.install
/etc/selinux/targeted/contexts/files/file_contexts.local
/etc/selinux/targeted/contexts/files/file_contexts.subs
/etc/.pwd.lock
/etc/tuned/post_loaded_profile

-mtime 根据修改时间来进行查找(单位:天)
ctime 根据改变时间来进行查找(单位:天)
atime 根据访问时间进行查找单(位:天)
+5 五天前
-5 五天以内

[root@zzd ~]# find -mtime -5		//查找当前目录下修改时间在五天以内的文件或目录
.
./.bash_history
./002
./qwer
./ABC
./.viminfo
./greptest
./.bashrc
./anaconda-ks.cfg
./passwd
./abc
./.lesshst
./test
./test/test1
./test/test2
./a
./a/ABC
./a/Abc
./a/ABc
./a/abc

[root@zzd ~]# find -mtime +5		//查找当前目录下修改时间在五天前的文件或目录
./.bash_logout
./.bash_profile
./.cshrc
./.tcshrc

-mmin 根据修改时间来进行查找(单位:分钟)
cmin 根据改变时间来进行查找(单位:分钟)
amin 根据访问时间进行查找单(位:分钟)
+5 五分钟前
-5 五分钟以内

[root@zzd ~]# touch passwd 
[root@zzd ~]# touch anaconda-ks.cfg 
[root@zzd ~]# touch greptest		
#对以上三个文件进行更新

[root@zzd ~]# find -mmin -5		//查找当前目录下修改时间在5分钟以内的文件货目录
./greptest
./anaconda-ks.cfg
./passwd

-perm mode 根据权限精确查找
-perm -mode 文件权限能完全包含此mode是才符合条件
-perm /mode 9位权限中有任何一位权限匹配都视为符合查找条件

[root@zzd ~]# find -perm 777		//查找当前目录下权限为777的文件或目录
./date.sh

[root@zzd ~]# find -perm -755		//查找当前目录下权限能够完全包含755的文件或目录
./test		
./test/test1
./test/test2
./a
./date.sh

[root@zzd ~]# find /root/a -perm /777	//查找/root/a目录下9为权限权限中有一位符合777九位权限中一位的文件或目录
/root/a
/root/a/ABC
/root/a/Abc
/root/a/ABc
/root/a/abc

3.2 处理动作

-print 显示

[root@zzd ~]# find -name greptest -print		//在当前目录查找文件名为greptest的文件,并显示
./greptest

-ls 类似于ls -l的形式显示每一个查找到的文件的详细信息

[root@zzd ~]# find -name greptest -ls		//在当前目录查找文件名为greptest的文件,并以长格式显示文件详细信息
 33820697      4 -rw-r--r--   1  1001     1001           62 Jul  4 23:55 ./greptest

-delete 删除查找到的文件

[root@zzd ~]# ls
002  a  abc  ABC  anaconda-ks.cfg  date.sh  greptest  passwd  qwer  test
[root@zzd ~]# find -name 002 -delete		//在当前目录查找文件名为002的文件并删除
[root@zzd ~]# ls
a  abc  ABC  anaconda-ks.cfg  date.sh  greptest  passwd  qwer  test

-fls 路径 查找到的文件以长格式保存至指定文件

[root@zzd ~]# find -name greptest -fls /root/findfls	//在当前目录查找文件名为greptest的文件,并以长格式保存至/root/findfls文件
[root@zzd ~]# cat findfls 
 33820697      4 -rw-r--r--   1  1001     1001           62 Jul  4 23:55 ./greptest

-ok 命令 {} ; 对查找到的文件执行命令,每次操作需要用户确认*

[root@zzd ~]# find -name greptest -ok rm -rf {} \; 		//在当前目录查找文件名为greptest的文件并执行删除命令
< rm ... ./greptest > ? n		//需要用户确认,y为是,n为否

-exec 命令 {} ; 对查找到的文件执行命令。不需要用户确认

[root@zzd ~]# find -name greptest -exec rm -rf {} \; 		//在当前目录查找文件名为greptest的文件并执行删除命令
[root@zzd ~]# ls
a  abc  ABC  anaconda-ks.cfg  date.sh  findfls  passwd  qwer  test

xargs 通过管道将查找到的内容给xargs处理,xargs后面直接跟命令即可。因为有些命令不能接收过多的参数,所以需要用到xargs

[root@zzd ~]# ls /opt/
abc  Abc  ABc  ABC  anaconda-ks.cfg  date.sh  findfls  passwd  qwer
[root@zzd ~]# 
[root@zzd ~]# find /opt -type f | xargs rm -rf 		//查找/opt目录下的所有文件,然后删除
[root@zzd ~]# ls /opt/
[root@zzd ~]#

3.3 组合条件

-a 必须同时满足所有条件,才符合查找标准

//拥有多个条件的时候,默认就是同时满足
[root@zzd ~]# tree /opt/
/opt/
├── a
│   └── abc
└── abc

2 directories, 1 file

[root@zzd ~]# find /opt -name abc -type f		//查找/opt目录下类型为文件且文件名为abc的文件
/opt/abc

[root@zzd ~]# find /opt -name abc -a -type f
/opt/abc

-o 只要满足其中一个条件就符合查找标准

[root@zzd ~]# find /opt -name abc -o -type f		//查找/opt目录下名为abc或类型为f的文件或目录
/opt/.bash_logout
/opt/.bash_profile
/opt/.cshrc
/opt/.tcshrc
/opt/.bash_history
/opt/.viminfo
/opt/.bashrc
/opt/.lesshst
/opt/abc
/opt/a/abc

4. 文件层级系统

FHS     //文件层级系统
/       //可以单独分区,LVM分区
/boot       //系统启动相关的文件,如内核(vmlinuz)、initrd(initramfs),\
            //以及grub(bootloader)。建议单独分区,基本分区
/dev        //设备文件。不能单独分区
    设备文件    //关联至一个设备驱动程序,进而能够与之对应硬件设备进行通信
        块设备     //随机访问,数据块(比如硬盘)
        字符设备    //也叫线性设备,线性访问,按字符为单位(比如鼠标、显示器)
        设备号     //主设备号(major)和次设备号(minor)
            主设备号标识设备类型
            次设备号标识同一类型下的不同设备
    设备文件只有元数据,没有数据
/etc        //配置文件
/home       //普通用户的家目录,每一个用户的家目录通常默认为/home/USERNAME。 \
            //建议单独分区
/root       //管理员的家目录。不该单独分区
/lib        //库文件
    静态库     //.a
    动态库     //.dll,.so(shared object)
    /lib/modules    //内核模块文件
/media      //挂载点目录,通常用来挂载移动设备
/mnt        //挂载点目录,通常用来挂载额外的临时文件系统,比如另一块硬盘
/opt        //可选目录,早期通常用来安装第三方程序
/proc       //伪文件系统,内核映射文件(伪文件系统实际上里面是没有任何内容的, \
            //开机之后才映射上去的)。不能单独分区
/sys        //伪文件系统,跟硬件设备相关的属性映射文件(伪文件系统实际上里面是没有 \
            //任何内容的,开机之后才映射上去的)。不能单独分区
/tmp        //临时文件,/var/tmp
/var        //可变化的文件,比如log、cache。存放日志信息、pid文件、lock文件,\
            //建议单独分区
/bin        //可执行文件,用户命令
/sbin       //管理命令
/usr        //shared,read-only,全局共享只读文件。提供操作系统核心功能,可以单独分区
    /usr/bin
    /usr/sbin
    /usr/lib
/usr/local      //第三方软件安装路径
    /usr/local/bin
    /usr/local/sbin
    /usr/local/lib
    /usr/local/etc
    /usr/local/man

/etc,/bin,/sbin,/lib内是系统启动就需要用到的程序,这些目录不能挂载额外的分区,\
必须在根文件系统的分区上

/usr/bin,/usr/sbin,/usr/lib提供操作系统核心功能,/usr可以单独分区

/usr/local/bin,/usr/local/sbin,/usr/local/lib,/usr/local/etc, \
/usr/local/man等等在/usr/local目录下的内容都是第三方软件,建议单独分区

5.重定向与管道服

5.1 系统设定

默认输入设备:标准输入,stdin, 0 (键盘)
默认输出设备:标准输出,stdout, 1 (显示器)
标准错误输出:stderr, 2 (显示器)

5.2 I/O重定向

> 覆盖

[root@zzd ~]# ls > new
[root@zzd ~]# cat new
a
abc
ABC
anaconda-ks.cfg
date.sh
findfls
new
passwd
qwer
test
[root@zzd ~]# ls abc > new		//覆盖了原本的内容
[root@zzd ~]# cat new 
abc

>> 追加

[root@zzd ~]# cat findfls >> new    //将findfls文件里的内容追加到文件new里
[root@zzd ~]# cat new 
abc
 33820697      4 -rw-r--r--   1  1001     1001           62 Jul  4 23:55 ./greptest

2> 重定向错误输出

[root@zzd ~]# asdf
-bash: asdf: command not found
[root@zzd ~]# asdf 2> 1.txt		//重定向错误输出,将报错写入1.txt文件
[root@zzd ~]# cat 1.txt 
-bash: asdf: command not found

2>> 追加重定向错误输出

[root@zzd ~]# ls sadgga 2>> 1.txt 		//重定向错误输出,将报错追加到1.txt文件
[root@zzd ~]# cat 1.txt 
-bash: asdf: command not found
ls: cannot access 'sadgga': No such file or directory

&> 覆盖重定向标准输出或错误输出至同一个文件

[root@zzd ~]# ls passwd asdf &> 1.txt 
[root@zzd ~]# cat 1.txt 
ls: cannot access 'asdf': No such file or directory
passwd

&>> 追加重定向标准输出或错误输出至同一个文件

[root@zzd ~]# cat findfls asfagh &>> 1.txt
[root@zzd ~]# cat 1.txt 
ls: cannot access 'asdf': No such file or directory
passwd
 33820697      4 -rw-r--r--   1  1001     1001           62 Jul  4 23:55 ./greptest
cat: asfagh: No such file or directory

< 输入重定向

[root@zzd ~]# cat 1.txt 
[root@zzd ~]# cat qwer 
root:x:0:0:root:/root:/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@zzd ~]# cat > 1.txt < qwer 
[root@zzd ~]# cat 1.txt 
root:x:0:0:root:/root:/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@zzd ~]# cat > dame << quit		//指向文件dame,输入,当遇到quit的时候退出
> 123
> 4
> qw
> as
> quit
[root@zzd ~]# cat dame 
123
4
qw
as

5.3 管道符

前一个命令的输出,作为后一个命令的输入。最后一个命令会在当前shell进程子shell进程中执行
命令1 | 命令2 | 命令3 | ...

[root@zzd ~]# ls
1.txt  a  abc  ABC  anaconda-ks.cfg  dame  date.sh  findfls  haha  new  passwd  qwer  test
[root@zzd ~]# ls | grep ABC		//列出当前目录下的所有文件或目录,将结果交给grep过滤ABC
ABC

5.4 tee

从标准输入读取数据,输出一份到屏幕上,一份保存到文件

[root@zzd ~]# echo 'Hello ZIC' | tee 1.txt 
Hello ZIC
[root@zzd ~]# cat 1.txt 
Hello ZIC

6.bash字符处理

6.1 截取变量的字符串

FILE=/usr/local/hadoop/etc/hadoop
echo ${FILE#*/}

[root@zzd ~]# FILE=/usr/local/hadoop/etc/hadoop		//创建一个变量FILE,值为/usr/local/hadoop/etc/hadoop
[root@zzd ~]# echo $FILE		//打印变量FILE	
/usr/local/hadoop/etc/hadoop

[root@zzd ~]# echo ${FILE#*/}		
usr/local/hadoop/etc/hadoop

echo ${FILE##*/}

[root@zzd ~]# echo ${FILE##*/}
hadoop

echo ${FILE%/*}

[root@zzd ~]# echo ${FILE%/*}
/usr/local/hadoop/etc

6.2 字符串切片

${var:offset:number}

[root@zzd ~]# echo $FILE		
/usr/local/hadoop/etc/hadoop
[root@zzd ~]# echo ${FILE:4:5}		//从变量FILE的第4个索引开始截取5个字符
/loca

6.3 取字符串最右侧几个字符(自右向左)

${var: -lengh} 注意:冒号后面必须有一空白字符

[root@zzd ~]# echo ${FILE: -6}		//截取变量FILE最右侧的6个字符
hadoop

6.4 查找替换

${var/pattern/substi} 查找var所表示的字符串中,第一次被pattern所匹配到字符串,以substi替换之

[root@zzd ~]# echo ${FILE/hadoop/had}	
/usr/local/had/etc/hadoop

${var//pattern/substi} 查找var所表示的字符串中,所有能被pattern所匹配到字符串,以substi替换之

[root@zzd ~]# echo ${FILE//hadoop/had}
/usr/local/had/etc/had

${var/#pattern/substi} 查找var所表示的字符串中,行首被pattern所匹配到字符串,以substi替换之

[root@zzd ~]# file='hello world'
[root@zzd ~]# echo $file
hello world
[root@zzd ~]# echo ${file/#hello/hi}
hi world

${var/%pattern/substi} 查找var所表示的字符串中,行尾被pattern所匹配到字符串,以substi替换之

[root@zzd ~]# echo ${FILE/%hadoop/had}
/usr/local/hadoop/etc/had

6.5 查找并删除

${var/pattern} 查找var所表示的字符串中,第一次被pattern所匹配到字符串,删除之

[root@zzd ~]# echo $FILE		
/usr/local/hadoop/etc/hadoop
[root@zzd ~]# echo ${FILE/hadoop}
/usr/local//etc/hadoop

${var//pattern} 查找var所表示的字符串中,所有被pattern所匹配到字符串,删除之

[root@zzd ~]# echo ${FILE//hadoop}
/usr/local//etc/

${var/#pattern} 查找var所表示的字符串中,行首被pattern所匹配到字符串,删除之

[root@zzd ~]# echo $file
hello world
[root@zzd ~]# echo ${file/#hello}
world

${var/%pattern} 查找var所表示的字符串中,行尾被pattern所匹配到字符串,删除之

[root@zzd ~]# echo ${FILE/%hadoop}
/usr/local/hadoop/etc/

6.6 字符大小写转换

${var^^} 所有小写转换为大写

[root@zzd ~]# echo ${FILE^^}		//将变量FILE里的小写转换为大写		
/USR/LOCAL/HADOOP/ETC/HADOOP

${var,,} 所有大写转换为小写

[root@zzd ~]# FILE=${FILE^^}	//将变量FILE里的小写转换为大写并赋予变量FILE
[root@zzd ~]# echo $FILE
/USR/LOCAL/HADOOP/ETC/HADOOP
[root@zzd ~]# echo ${FILE,,}		//将FILE变量里的大写都转换为小写
/usr/local/hadoop/etc/hadoop

相关内容