Linux基础命令(三)

  • Linux基础命令(三)已关闭评论
  • 24 次浏览
  • A+
所属分类:linux技术
摘要

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


Linux基础命令(三)

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