1.文件管理之:字符处理命令(sort、uniq、cut、sed、grep、awk、wc、)
----------------------------------------sort排序----------------------------------------
在有些情况下,需要对应一个无序的文本文件进行数据的排序,这时就需要使用sort进行排序了。
sort [OPTION]... [FILE]...
# -r:倒序 -n:按数字排序 -t:指定分隔符(默认空格) -k:指定第几列, 指定几列几字符(指定1,1 3.1,3.3)
#1.首先创建一个文件,写入一写无序的内容
[root@xuliangwei ~]# cat >> file.txt < b:3 c:2 a:4 e:5 d:1 f:11 EOF #2.使用sort下面对输出的内容进行排序 [root@xuliangwei ~]# sort file.txt a:4 b:3 c:2 d:1 e:5 f:11 #结果并不是按照数字排序,而是按字母排序。 #可以使用-t指定分隔符, 使用-k指定需要排序的列。 [root@xuliangwei ~]# sort -t ":" -k2 sort.txt d:1 f:11 #第二行为什么是11?不应该按照顺序排列? c:2 b:3 a:4 e:5 #按照排序的方式, 只会看到第一个字符,11的第一个字符是1, 按照字符来排序确实比2小。 #如果想要按照数字的方式进行排序, 需要使用 -n参数。 [root@xuliangwei ~]# sort -t ":" -n -k2 p.txt d:1 c:2 b:3 a:4 e:5 f:11 #测试案例,下载文件http://fj.xuliangwei.com/public/ip.txt,对该文件进行排序 [root@xuliangwei ~]# sort -t. -k3.1,3.1nr -k4.1,4.3nr ip.txt ----------------------------------------uniq去重---------------------------------------- 如果文件中有多行完全相同的内容,当前是希望能删除重复的行,同时还可以统计出完全相同的行出现的总次数, 那么就可以使用uniq命令解决这个问题(但是必须配合sort使用)。 uniq [OPTION]... [INPUT [OUTPUT]] #选项:-c 计算重复的行 #1.创建一个file.txt文件: [root@xuliangwei ~]# cat >> file1.txt < abc 123 abc 123 EOF #2.uniq需要和sort一起使用, 先使用sort排序, 让重复内容连续在一起 [root@xuliangwei ~]# sort file.txt 123 123 abc abc #3.使用uniq去除相邻重复的行 [root@xuliangwei ~]# cat file.txt |sort|uniq 123 abc #4.-c参数能统计出文件中每行内容重复的次数 [root@xuliangwei ~]# cat file.txt |sort|uniq -c 2 123 2 abc 请统计分析如下日志,统计访问量最高的IP,打印前top10的IP. [root@www ~]# awk '{print $1}' docs.xuliangwei.log |sort |uniq -c|sort -n|tail -5 101 139.226.172.91 159 139.226.173.216 347 139.226.173.12 446 123.207.173.97 495 114.92.159.100 ----------------------------------------cut截取字段---------------------------------------- cut OPTION... [FILE]... #选项:-d 指定分隔符 -f 数字,取第几列 –f3,6三列和6列 -c 按字符取(空格也算) echo "Im xlw, is QQ 552408925" >file.txt #过滤出文件里 xlw以及552408925 [root@www ~]# cut -d " " -f 2,5 file.txt |awk -F "," '{print $1,$2}' [root@www ~]# awk '{print $2,$5}' file.txt |awk -F "," '{print $1,$2}' [root@www ~]# awk -F '[, ]' '{print $2,$6}' file.txt [root@www ~]# awk -F '[, ]+' '{print $2,$5}' file.txt #参考 [root@www ~]# cut -d " " -f 2,5 file.txt|sed 's#,##g' 取列:cut awk(推荐) 替换:sed 取行:grep awk #实现上述题目几种思路 # cut -d " " -f2,5 file.txt # cut -d " " -f2,5 file.txt |sed 's#,##g' # sed 's#,# #g' file.txt | awk -F " " '{print $2 " " $5}' # awk '{print $2,$5}' file.txt |awk -F ',' '{print $1,$2}' # awk -F "[, ]" '{print $2,$6}' file.txt # awk -F '[, ]+' '{print $2,$5}' file.txt 过滤,取行 # awk '/root/' /etc/passwd # awk '/^root/' /etc/passwd ----------------------------------------wc统计行号---------------------------------------- wc [OPTION]... [FILE]... #选项:-l显示文件行数 -c显示文件字节 -w显示文件单词 # wc -l /etc/fstab #统计/etc/fstab文件有多少行 # wc -l /etc/services #统计/etc/services 文件行号 #扩展方法 # grep -n "." /etc/services | tail -1 # cat -n /etc/services | tail -1 习题:过滤出/etc/passwd以nologin结尾的.并统计有多少行 # grep "nologin$" /etc/passwd | wc -l 习题:使用ifconfig获取当前的IP地址,使用sed\awk\grep取当前服务器的ens32的IP地址 yum install net-tools -y #没有ifconfig请安装这个软件包 1.我要取的值在哪 2.如何去缩小范围,缩小到行,精确到列(想要的值) # ifconfig ens32|grep "inet "|cut -d " " -f 10 # ifconfig ens32|grep "inet "|awk '{print $2}' # ifconfig ens32|awk '/inet /'|awk '{print $2}' # ifconfig ens32|awk '/inet /'|sed -r 's#^.*et (.*) net.*$#\1#g' (扩展) awk取行 # ifconfig ens32|awk 'NR==2 {print $2}' #NR代表的是行号,NR==2 代表要取输出结果的第二行 sed取行 # ifconfig ens32|sed -n '2p'|awk '{print $2}' # ifconfig ens32|sed -rn '2s#^.*et (.*) net.*$#\1#gp' (扩展学习) 习题: 分析如下日志,统计每个域名被访问的次数。 [root@student tmp]# cat >> web.log < http://www.xuliangwei.com/index.html http://www.xuliangwei.com/1.html http://post.xuliangwei.com/index.html http://mp3.xuliangwei.com/index.html http://www.xuliangwei.com/3.html http://post.xuliangwei.com/2.html EOF 1.提取域名 2.对域名进行排序 3.对域名进行去重,然后统计 # awk -F "/" '{print $3}' web.log |sort |uniq -c # cat web.log |cut -d "/" -f3|sort|uniq -c # sed -r 's#^.*//(.*)/.*$#\1#g' web.log #扩展 习题:将该/etc/sysconfig/selinux文件中的SELINUX=enforcing替换为SELINUX=disabled 1.提取需要替换的内容 2.模拟演练 3.真的修改 [root@www ~]# sed 's#^SELINUX=.*#SELINUX=disabled#g' /etc/sysconfig/selinux [root@www ~]# sed -i 's#^SELINUX=.*#SELINUX=disabled#g' /etc/sysconfig/selinux 习题:将如下文件的内容root和/bin/bash位置交换 [root@www ~]# cat /etc/passwd root:x:0:0:root:/root:/bin/bash # awk '/^root/' /etc/passwd|awk -F ":" '{print $7":"$2":"$3":"$4":"$5":"$6":"$1}' # awk -F ":" '/^root/ {print $7":"$2":"$3":"$4":"$5":"$6":"$1}' /etc/passwd # sed -n '1p' /etc/passwd # sed -n '1p' /etc/passwd|sed -r 's#(root)(.*)(/bin/bash)#\3\2\1#g' # sed -n '2p' /etc/passwd|sed -r 's#(^.*1:)(.*)(/.*:)(/.*)(/.*)#\1\4\3\2\5#g' 6.linux文件属性 [root@xuliangwei ~]# ls -l ks.cfg -rw-------. 1 root root 4434 May 30 13:58 ks.cfg # -rw-------. ①:第一个字符是文件类型,其他则是权限 1 ②:硬链接次数 root ③:文件属于哪个用户 root ④:文件属于哪个组 4434 ⑤:文件大小 May30 13:58 ⑥⑦⑧:最新修改的时间与日期 ks.cfg ⑨:文件或目录名称 7.linux文件类型 [root@www ~]# ll -d /etc/hosts /tmp /bin/ls /dev/sda /dev/tty1 /etc/grub2.cfg /dev/log /run/dmeventd-client -rwxr-xr-x. 1 root root 117680 Oct 31 03:16 /bin/ls srw-rw-rw-. 1 root root 0 Apr 3 16:57 /dev/log brw-rw----. 1 root disk 8, 0 Apr 3 16:57 /dev/sda crw--w----. 1 root tty 4, 1 Apr 3 16:57 /dev/tty1 lrwxrwxrwx. 1 root root 22 Mar 28 03:33 /etc/grub2.cfg -> ../boot/grub2/grub.cfg -rw-r--r--. 1 root root 158 Apr 1 18:09 /etc/hosts prw-------. 1 root root 0 Apr 3 16:57 /run/dmeventd-client drwxrwxrwt. 22 root root 4096 Apr 3 20:57 /tmp - 通常指的是文件 s socket文件(mysql) b block 块设备(磁盘\分区光盘) c 字符设备 l 链接文件(呈现浅蓝色) d 目录文件(呈现蓝色状态) 第二种方式: 当无法通过ls -l的属性识别该文件是什么类型时,可以通过file进行查看 我们会将文件标注对应的后缀. .txt .sh .mp3 .mp4 .exe .zip Linux的文件加上后缀能够便于我们快速的识别.这个文件是什么类型. linux系统链接文件 软链接 其实就是通过inode指向block #软链接使用场景 1.软件升级 2.企业代码发布 3.不方便目录移动 [root@www ~]# ll total 0 lrwxrwxrwx. 1 root root 14 Apr 3 23:47 qq -> /root/qq_v1.1/ #先执行删除,然后执行ln操作, && (&&前面的命令执行成功,则立即执行&&后面的命令) [root@www ~]# rm -f /root/qq && ln -s /root/qq_v1.2/ /root/qq #版本升级 [root@www ~]# rm -f /root/qq && ln -s /root/qq_v1.1/ /root/qq #版本回退 5.硬链接与软链接区别 1)ln命令创建硬链接,ln -s命令创建软链接。 2)目录不能创建硬链接,并且硬链接不可以跨越分区系统。 3)目录软链接特别常用, 并且软链接支持跨越分区系统。 4)硬链接文件与源文件的inode相同,软链接文件与源文件inode不同。 5)删除软链接文件,对源文件及硬链接文件无任何影响。 6)删除文件的硬链接文件,对源文件及链接文件无任何影响。 7)删除链接文件的源文件,对硬链接无影响,会导致软链接失效。 8)删除源文件及其硬链接文件,整个文件会被真正的删除。 总结: 1.符号链接就是软链接,类似于快捷方式,inodeid不同,删除源文件,则软链接失效. 2.硬链接则是拥有相同inodeid的文件,只有删除所有文件后,才会失效. 面试题: 当前的磁盘空间还剩余500GB,但就是无法往里面写入数据. No space left on device 要不是真的没有磁盘空间(),要么就是inode被沾满 8.linux命令执行流程(扩展) ping 探测对端主机是否存活 1) 命令是否通过绝对路径执行 2) 命令是否存在alias别名 3) 用户输入的是shell内置命令还是外置命令 type -a 4) Bash内部命令直接执行,外部命令检测是否存在缓存 5) 查找系统全局$PATH,变量中保存的全部都是命令存放的路径,有执行,无报错command not found 2.什么是内部命令,什么是外部命令 内部命令: shell程序自带的命令。 外部命令: 在系统PATH变量的某个路径下的可执行程序。 3.如何检查用户输入的命令是内部命令还是外部命令 #cd命令属于shell内部命令 [root@linux-node1 ~]# type -a cd cd is a shell builtin cd is /usr/bin/cd #ping属于外部命令, 同时会打印当前命令路径 [root@xuliangwei ~]# type -a ping ping is /bin/ping 4.如果是外置命令,Bash可以通过查找PATH变量,获取该命令的绝对路径。 #打印当前环境变量目录 [root@xuliangwei ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin PS: PATH由多个路径组成,每个路径值之间用冒号间隔,对这些路径的增加和删除操作都将影响到Bash解释器对Linux命令的查找 5.如果是外置命令还会涉及到一个内存缓存,也就是说,当我们出现重复执行相同的命令,会通过缓存调取执行,也就意味着不会搜索PATH路径。 #表缓存命令所在位置 [root@xuliangwei ~]# hash hits command 1 /usr/bin/tty 3 /sbin/ifconfig #已缓存命令,如果移动位置会导致无法找到该命令 [root@xuliangwei ~]# mv /sbin/ifconfig /bin/ [root@xuliangwei ~]# ifconfig -bash: /sbin/ifconfig: No such file or directory #删除缓存过的ifconfig命令, 即可执行 [root@xuliangwei ~]# hash -d ifconfig [root@xuliangwei ~]# ifconfig #当然可以清空缓存表 [root@xuliangwei ~]# hash -r #注意: 命令缓存hash需要注意如下情况: 1.只要执行外部命令1次就会对该命令进行缓存 2.如果将命令移动了位置,该如何执行 a.使用绝对路径执行 b.删除hash表的缓存指令 6.命令执行流程总结: 当我们执行了一个ping命令之后, 整个命令执行的流程步骤如下: 1) 检查执行的命令是否使用的是绝对路径执行的。 2) 检查ping命令是否存在alias别名 3) 检查ping命令是内部命令还是外部命令 4) 如果是内部命令Bash直接执行,如果是外部命令,首先检查Hash缓存,存在则直接调取 5) 如果该命令不存在Hash缓存,则通过PATH路径进行逐行查找该命令所在的位置 6) 如果PATH路径没有查找到该命令所在的路径,则返回错误码。command not found /bin/ls 通过绝对路径执行 ls #alias hash $PATH -------------------------------------------------- 1.文件排序 sort 2.文件去重 uniq 3.文件截取 cut awk sed 4.文件统计 wc 5.文件属性 文件类型 第一种: ls -l 第二种file 6.链接文件 文件的存储方式 用户数据 存的是真的block数据 block 元数据 存储的文件的权限\用户信息\大小\时间等等 但不存储文件名称. inode 软连接,快捷方式 软件升级 代码发布 硬链接,不同的文件名使用相同的inode 7.扩展:命令的执行流程 1.绝对路径 2.检查该命令是否存在别名 3.检查shell内置,还是外置,内置执行,外置检查缓存,检查path路径,提示command not found