Linux-6 三剑客命令
-
awk(取列)
将系统的IP地址打印出来
[root@destiny ~]# yum install net-tools -y #分析: #1.肯定是需要拿到IP地址,仅看某一个特定的网卡;ifconfig #2.先想办法过滤出数据的那一行; ###行 #3.然后掐头去尾,取中间; ###列
[root@destiny ~]# ifconfig ens32 | grep "inet" inet 10.0.0.100 netmask 255.255.255.0 broadcast 10.0.0.255 inet6 fe80::b511:c46f:6799:880 prefixlen 64 scopeid 0x20<link> [root@destiny ~]# ifconfig ens32 | grep "inet " inet 10.0.0.100 netmask 255.255.255.0 broadcast 10.0.0.255 [root@destiny ~]# ifconfig ens32 | grep "inet " | awk '{print $2}' 10.0.0.100 #纯awk方法: [root@destiny ~]# ifconfig ens32 | awk 'NR==2' inet 10.0.0.100 netmask 255.255.255.0 broadcast 10.0.0.255 [root@destiny ~]# ifconfig ens32 | awk 'NR==2' | awk '{print $2}' 10.0.0.100 [root@destiny ~]# ifconfig ens32 | awk 'NR==2 {print $2}' 10.0.0.100 #grep 过滤行级别; #awk 过滤列级别; #练习:打印 /etc/passwd 中 用户名称,以及用户的UID;第一列和第三列,需要以:为分隔符; #默认awk是以空格作为分隔符 #如何自行指定字段分隔符 -F ':' [root@destiny ~]# awk -F ':' '{print $1,$3}' /etc/passwd
-
grep命令
-
#————grep 过滤文件内容 [root@destiny ~]# grep "root" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin #过滤以root开头的 [root@destiny ~]# grep "^root" /etc/passwd root:x:0:0:root:/root:/bin/bash #过滤以/bin/bash结尾的 [root@destiny ~]# grep "/bin/bash$" /etc/passwd root:x:0:0:root:/root:/bin/bash # -i 不区分大小写 [root@destiny ~]# grep -i "root" /etc/passwd # -v 除了包含关键字的不要,别的都要;取反 [root@destiny ~]# grep -v "root" /etc/passwd #包含多个关键字 [root@destiny ~]# egrep "root|sshd" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin [root@destiny ~]# grep -E "root|sshd" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin #匹配文件中包含/bin/bash结尾或root字符串的 [root@destiny ~]# grep -Ei "/bin/bash$|root" /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin # -n 取行号 [root@destiny ~]# grep -n "." /etc/passwd # .在grep中表示任意单个字符;即所有 # grep -n -A 2 "Failed" /var/log/secure #匹配/var/log/secure文件中Failed字符串,并打印它的下2行 [root@destiny ~]# grep -n -A 2 "/bin/bash$" /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 2-bin:x:1:1:bin:/bin:/sbin/nologin 3-daemon:x:2:2:daemon:/sbin:/sbin/nologin # grep -n -B 2 "Failed" /var/log/secure #匹配/var/log/secure文件中Failed字符串,并打印它的上2行 [root@destiny ~]# grep -n -B 2 "adm" /etc/passwd 2-bin:x:1:1:bin:/bin:/sbin/nologin 3-daemon:x:2:2:daemon:/sbin:/sbin/nologin 4:adm:x:3:4:adm:/var/adm:/sbin/nologin # grep -n -C 2 "Failed" /var/log/secure #匹配/var/log/secure文件中Failed字符串,并打印它的上下2行 [root@destiny ~]# grep -n -C 2 "adm" /etc/passwd 2-bin:x:1:1:bin:/bin:/sbin/nologin 3-daemon:x:2:2:daemon:/sbin:/sbin/nologin 4:adm:x:3:4:adm:/var/adm:/sbin/nologin 5-lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 6-sync:x:5:0:sync:/sbin:/bin/sync
-
-
sed替换
-
# 把/etc/selinux/config里的enforcing替换成disabled [root@destiny ~]# sed 's#enforcing#disabled#g' /etc/selinux/config # s表示开始,g代表全局 #默认情况下,sed的替换不会修改文件的本身; #只有在添加 -i 的情况下,才会真的替换 [root@destiny ~]# sed -i 's#enforcing#disabled#g' /etc/selinux/config #明确替换某一行的内容,例如第8行 [root@destiny ~]# sed '8s#enforcing#disabled#g' /etc/selinux/config #指明替换某一行就替换某一行,不指明就是全局 #高级一点 #-n 指的是取消默认的输出 [root@destiny ~]# ifconfig ens32 ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.0.0.100 netmask 255.255.255.0 broadcast 10.0.0.255 inet6 fe80::b511:c46f:6799:880 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:81:8e:7b txqueuelen 1000 (Ethernet) RX packets 1970 bytes 148837 (145.3 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 803 bytes 99898 (97.5 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@destiny ~]# ifconfig ens32 | sed '2p' ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.0.0.100 netmask 255.255.255.0 broadcast 10.0.0.255 inet 10.0.0.100 netmask 255.255.255.0 broadcast 10.0.0.255 inet6 fe80::b511:c46f:6799:880 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:81:8e:7b txqueuelen 1000 (Ethernet) RX packets 2014 bytes 152549 (148.9 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 827 bytes 103682 (101.2 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@destiny ~]# ifconfig ens32 | sed -n '2p' inet 10.0.0.100 netmask 255.255.255.0 broadcast 10.0.0.255
#纯sed方法实现获取ens32中的ip地址 [root@destiny ~]# ifconfig ens32 ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.0.0.100 netmask 255.255.255.0 broadcast 10.0.0.255 inet6 fe80::b511:c46f:6799:880 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:81:8e:7b txqueuelen 1000 (Ethernet) RX packets 2232 bytes 168202 (164.2 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 868 bytes 108030 (105.4 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 #分析: #1.先拿到关键字的行;(缩小范围) [root@destiny ~]# ifconfig ens32 | sed -n '2p' inet 10.0.0.100 netmask 255.255.255.0 broadcast 10.0.0.255 #2.掐头去尾留中间 [root@destiny ~]# ifconfig ens32 | sed -n '2p' | sed -r 's#(^.*et) (.*) (net.*$)# \2 #g' 10.0.0.100 #第一个括号匹配到前面的所有内容 #.表示任意单个字符 *表示重复前面字符0次或多次 # ^.*et 表示以任意单个字符开始,重复一次或多次,然后当碰到et后终止匹配 #第二个括号要匹配到需要的内容 #.表示任意单个字符 *表示重复前面字符0次或多次 #第三个括号匹配到结尾 # net.*$表示net后的字符直到结尾 #三个括号间的空格加不加都可以 # \2 表示引用第2个括号的内容
#使用grep结合awk方法实现获取ens32中的ip地址 [root@destiny ~]# ifconfig ens32 | grep "netmask" | awk '{print $2}' 10.0.0.100 #使用grep结合sed方法实现获取ens32中的ip地址 [root@destiny ~]# ifconfig ens32 | grep "netmask" | sed -r 's#(^.*et) (.*) (net.*$)# \2 #g' 10.0.0.100 #使用纯awk方法实现获取ens32中的ip地址 [root@destiny ~]# ifconfig ens32 | awk 'NR==2 {print $2}' 10.0.0.100
-
-
文件类型
-
Linux一切皆文件;文件是否需要区分类型?
-
[root@destiny ~]# ll -d /etc/hosts /tmp /bin/ls /dev/sda /dev/ttyl /etc/grub2.cfg /dev/log /run/dmeventd-client -rwxr-xr-x. 1 root root 117608 Aug 20 2019 /bin/ls srw-rw-rw-. 1 root root 0 Dec 31 08:11 /dev/log brw-rw----. 1 root disk 8, 0 Dec 31 08:11 /dev/sda crw--w----. 1 root tty 4, 1 Dec 31 08:11 /dev/ttyl lrwxrwxrwx. 1 root root 22 Dec 6 16:55 /etc/grub2.cfg -> ../boot/grub2/grub.cfg -rw-r--r--. 1 root root 158 Jun 7 2013 /etc/hosts prw-------. 1 root root 0 Dec 31 08:11 /run/dmeventd-client drwxrwxrwt. 52 root root 4096 Dec 31 08:12 /tmp #说明 - #普通文件(文本,二进制,压缩,图片,日志等) #实际情况,大家都会遵循一定的规范来进行文件的命名 #比如:视频文件:xx.mp4 #脚本文件:xx.sh xx.pu #如果不遵循命名的后缀规范,可以使用file查询这个文件究竟是什么类型; [root@destiny ~]# file file.txt file.txt: ASCII text d #目录文件 b #设备文件(块设备)存储设备 硬盘,U盘,SD卡 /dev/sda, c #设备文件(字符设备) 键盘,终端 /dev/ttyl s #套接字文件,进程与进程之间的一种通信方式(socket) #同一台服务器,两个不同的进程,需要相互调用时,可以走socket协议;不同服务器中,要走网络协议,例如TCP,不能走socket协议; l #链接文件;通常是软链接;在Windows系统中叫做快捷方式;
-
-
文件属性
[root@destiny ~]# ll total 86820 -rw-r--r--. 1 root root 16955 Mar 6 16:58 access_log #总共九列: -rw-r--r-- # 第一列:权限(权限管理) 1 # 第二列:硬链接数 root # 第三列:文件的拥有人;(用户管理) root # 第四列:文件的拥有组;(用户管理) 16955 # 第五列:文件的大小 Mar 6 16:58# 第六七八列:文件的时间;修改时间; access_log # 第九列:文件名称; #
-
文件链接
-
文件存储
-
文件有文件名和数据,在Linux上被分成两个部分:数据(data)与文件元数据(metadata)。
- 数据(data block),也叫Block,数据块是用来记录文件真实内容的地方,我们也将其称为Block;
- 元数据(metadata),也叫inode,用来记录文件大小,创建时间,所有者等信息。需要注意:inode并不包含文件名称;
-
inode包含文件的元信息,具体来说有以下内容:
- 文件的字节数
- 文件的User ID Group ID
- 文件的读,写,执行权限
- 文件的时间戳
- 链接数,即有多少文件名指向这个inode
- 文件数据block的位置
-
每个inode都有一个编号,我们的Linux系统是通过inode来识别文件的。对于系统来说,文件名指示inode编号的一个别名,或者绰号,(便于我们人识别)。表面上,用户是通过文件名打开的文件;实际上,系统用内部这个过程分为三步:
- 首先,系统找到这个文件名对应的inodde编号
- 其次,通过inode编号,获取inode信息
- 最后,根据inode信息,找到文件数据所在的block,读出数据
-
真正存储文件时,会将文件名称——映射到对应的Inode值——保存文件的权限,创建时间,属性等信息——文件存储的内容在磁盘的哪个block上;
-
读取时,文件名称——inode编号——获取block存储的位置——从磁盘中拿到数据
-
为什么cd.是当前目录,而cd…是上级目录?
-
[root@destiny ~]# ll -a -i 33574977 dr-xr-x---. 2 root root 189 Dec 23 17:09 . 64 dr-xr-xr-x. 19 root root 250 Dec 22 16:02 .. [root@destiny ~]# ll -d /root -i 33574977 dr-xr-x---. 2 root root 189 Dec 23 17:09 /root #.和/root使用的是同一个inode,而.和/root只是别名 [root@destiny ~]# cd /usr/local/ [root@destiny local]# ll -d -i /usr/ 33630947 drwxr-xr-x. 13 root root 155 Dec 6 16:54 /usr/ [root@destiny local]# ll -a -i total 0 50332074 drwxr-xr-x. 12 root root 131 Dec 6 16:54 . 33630947 drwxr-xr-x. 13 root root 155 Dec 6 16:54 .. #.和当前目录的Inode是一样的 #..和上一级目录的Inode是一样的 #.和..在你创建一个文件的时候,系统默认就有了
-
-
-
软链接(soft link)
-
软链接相当于Windows系统的快捷方式,软连接文件会将inode指向源文件block,当我们访问这个软链接文件时,其实访问的是源文件本身。
-
[root@destiny ~]# ln -s file2.txt file3.txt [root@destiny ~]# ll total 16 -rw-r--r--. 1 root root 20 Dec 23 17:09 file2.txt lrwxrwxrwx. 1 root root 9 Dec 31 09:43 file3.txt -> file2.txt -rw-r--r--. 1 root root 25 Dec 23 16:31 file.txt [root@destiny ~]# ll -i file2.txt file3.txt 33579966 -rw-r--r--. 1 root root 20 Dec 23 17:09 file2.txt 34281383 lrwxrwxrwx. 1 root root 9 Dec 31 09:43 file3.txt -> file2.txt [root@destiny ~]# cat file2.txt abc 123 abc 123 456 [root@destiny ~]# cat file3.txt abc 123 abc 123 456 [root@destiny ~]# rm -f file2.txt [root@destiny ~]# cat file3.txt cat: file3.txt: No such file or directory
-
软链接其实就是建立一个快捷方式
- 源文件本身——Inode——Block
- 软链接——Inode与源文件不一样,但是指向的Block是同一个
- 创建软链接的方式:ln -s 源文件 链接文件;
-
软链接的使用场景:
- 代码发布时;
- 版本升级时
- /data/qq
- /data/qq-v1.1
- /data/qq-v1.2
-
软链接实战
#1.准备网站1.1版本代码 [root@destiny ~]# mkdir /data/rainbow-v1.1 -p [root@destiny ~]# echo "123" > /data/rainbow-v1.1/index.html #2.创建软链接 [root@destiny ~]# ln -s /data/rainbow-v1.1/ /data/raionbow [root@destiny ~]# ll /data/ #3.检查网站程序 [root@destiny ~]# cat /data/rainbow/index.html 123 #4.新更新一个网站的程序代码 [root@destiny ~]# mkdir /data/rainbow-v1.2 [root@destiny ~]# echo "456" > /data/rainbow-v1.2/index.html #5.升级 [root@destiny ~]# rm -f /data/rainbow &&ln -s /data/rainbow-v1.2/ /data/rainbow [root@destiny ~]# cat /data/rainbow/index.html 456 #6.退回 [root@destiny ~]# rm -f /data/rainbow &&ln -s /data/rainbow-v1.1/ /data/rainbow [root@destiny ~]# cat /data/rainbow/index.html 123
-
-
硬链接(hard link)
- 硬链接类似于超市有多个门,无论从哪个门进入,看到的内容都是一样的。如果关掉一扇门,那影响进入超市?回到系统中,我们对硬链接的解释,不同的文件名指向同一个inode,简单地说,就是指向同一个真实的数据。
- 硬链接与软链接的区别:
- ln命令创建硬链接, ln -s创建软链接
- 目录不能创建硬链接,并且硬链接不可以跨越分区系统
- 目录软链接特别常用,并且软链接支持跨域分区系统
- 硬链接文件与源文件inode相同,软链接文件与源文件inode不相同
- 删除软链接文件,对源文件及硬链接文件无任何影响
- 删除文件的硬链接文件,对源文件及链接文件无任何影响
- 删除链接文件的源文件,对硬链接无影响,会导致软链接失效
-