2020-03-29 sort uniq cut sed grep awk wc 等 linux命令的使用与案例

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

你可能感兴趣的:(2020-03-29 sort uniq cut sed grep awk wc 等 linux命令的使用与案例)