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 <<EOF
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 <<EOF
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 <<EOF
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