Linux基础命令(三)
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