点击关注上方“知了小巷”,
设为“置顶或星标”,第一时间送达干货。

Linux操作系统(下)
内容提纲:
13. Linux文件权限
14. Linux压缩(打包)和解压缩
15. Linux开关机和重启
16. Linux服务管理
17. Linux系统管理
18. Linux软件安装
19. Linux进程管理
20. Linux定时任务
21. Linux高级文本处理命令
13. Linux文件权限
Linux是多用户的操作系统,允许多个用户同时在系统上登录和工作。为了确保系统和用户的安全,Linux采取了很多的安全措施。通过用户的代号(UID)来确定每个用户在登录系统后都做了些什么,也可以用来区别不同用户所建立的文件或目录。
普通用户只能不受限制的操作自己的home目录及其子目录下的所有文件;对系统中其他目录的访问受到限制:“同组权限”和“其他人权限”。
使用者和权限类别
文件和目录的使用者
超级用户 文件或目录的属主 属主的同组人 其他人
对每一类使用者设置对文件的操作权
可读 可写 可执行
Linux文件权限的描述格式解读
# 二进制 111 101 101 --> 755)
d rwx r-x r-x
d:文件类型,目录d,文件-,链接l;
rwx:读写执行权限 (r可读,w可写,x可执行)
u第一组rwx:表示这个文件的拥有者对它的权限:可读可写可执行 g第二组r-x:表示这个文件的所属组用户对它的权限:可读,不可写,可执行 o第三组r-x:表示这个文件的其他用户(相对于上面两类用户)对它的权限:可读,不可写,可执行
| 文件 | 文件夹 | |
|---|---|---|
| r | 可读取内容 | 可以ls |
| w | 可修改文件的内容 | 可以在其中创建或者删除子节点 |
| x | 能否运行这个文件 | 能否cd进入这个目录 |

权限的文字设定法
人员标识
属主(u) 同组(g) 其他人(o) 所有的人员(a)
设定方法
+
:增加权限-
:删除权限– =
:分配权限,同时删除旧的权限
权限字符
r(可读) w(可写) x(可执行)
修改权限
# 表示将haha.dat对所属组的rw权限取消
chmod g-rw haha.dat
# 表示将haha.dat对其他人的rw权限取消
chmod o-rw haha.dat
# 表示将haha.dat对所属用户的权限增加x
chmod u+x haha.dat
# 表示将haha.dat对所用户取消x权限
chmod a-x haha.dat
chmod u+rwx,g+rx,o+rx haha.dat
也可是使用数组来表示: chmod 664 haha.dat
就会修改成 rw-rw-r—如果要将一个文件夹的所有内容权限统一修改,则可以-R参数 chmod -R 770 aaa/
修改文件所有权
只有root用户才能更改文件所有权:
# 改变所属用户
chown xxxxx aaa
# 改变所属组
chown :xxxxx aaa
# 同时修改所属用户和所属组
chown xxxxx:xxxxx aaa/
# 包括子文件、子文件夹,加上-R
chown -R xxxxx:xxxxx aaa/
14. Linux压缩(打包)和解压缩
gzip压缩: gzip ma.txtgzip解压缩: gzip -d ma.txt.gz
或者gunzip ma.txt.gzbzip2压缩: bzip2 ma.datbzip2解压缩: bzip2 -d ma.dat.bz2
或者bunzip2 ma.dat.bz2打包: tar -cvf ma.txt.tar ma.txt追加打包: tar -rvf ma.txt.tar ma.dat
表示将ma.dat文件追加到ma.txt.tar当中解包: tar -xvf ma.txt.tar打包并压缩: tar -zcvf ma.tar.gz root/ma/解包并解压缩: tar -zxvf ma.tar.gz查看压缩包内容: tar -ztvf ma.tar.gz打包并压缩成bz2: tar -jcvf a.tar.bz2解压bz2: tar -jxvf a.tar.bz2
还有zip和unzip。
tar命令
比如通常 -zxvf
z:gzip,通过gzip格式压缩或者解压缩 c:create,创建压缩文件 x:extract,解压缩文件,或者叫还原文件 v:verbose,显示过程 f:file,指定文件 t:list,列出文件 j:支持bzip2压缩和解压缩
15. Linux开关机和重启
开机:开机键
关机:shutdown,halt,init 0,poweroff
重启:reboot,init 6
shutdown命令详解:
## 立刻关机
shutdown -h now
## 10分钟以后关机
shutdown -h +10
## 12点整的时候关机
shutdown -h 12:00:00
16. Linux服务管理
执行命令:
# 列出所有的系统服务
chkconfig –list
如果想查看系统的服务开启与否信息,可以使用命令:
$ systemctl list-unit-files
aliyun.service enabled
arp-ethers.service disabled
disabled:开机不启动
enabled:开机启动
列出所有enabled, active的service:
$ systemctl list-units --type=service
UNIT LOAD ACTIVE SUB DESCRIPTION
aegis.service loaded active running LSB: aegis update.
agentwatch.service loaded active exited SYSV: Starts and stops guest agent
aliyun.service loaded active running Aliyun Service Daemon
列出所有service,不论active还是inactive又或者是failed和not-found:
systemctl list-units --type=service --all
列出所有已安装的service,不论有没有运行,不论有没有设置为系统启动项,不论服务是否还有效:
$ systemctl list-unit-files --type=service
UNIT FILE STATE
aliyun.service enabled
arp-ethers.service disabled
一般安装的service file可能会有4中状态:
enabled 安装了的,并会随系统启动而启动。 static Enabled服务启动时需要同时启动的依赖服务。 disabled 已安装,但不可随系统启动而同时启动的服务。 invalid 无效的
httpd服务
以httpd服务(httpd是Apache超文本传输协议(HTTP)服务器的主程序,通俗的理解可以是文件服务器或者网页服务器)为例子,在CentOS7系统中默认没有安装httpd服务。
所以先执行命令:
# 安装httpd服务
yum -y install httpd
查看服务的状态: systemctl status httpd开启服务: systemctl start httpd关闭服务: systemctl stop httpd重启服务: systemctl restart httpd设置服务开机启动: system enable httpd设置服务开机不启动: system disable httpd
17. Linux系统管理
挂载外部设备mount
挂载是一个非常重要的功能,使用非常频繁。它指将一个设备(通常是存储设备,可以挂载光盘、硬盘、磁带、光盘镜像文件等)挂接到一个已存在的目录上(这个目录可以不为空,但挂载后这个目录下以前的内容将不可用)。
Linux操作系统将所有的设备都看作文件,它将整个计算机的资源都整合成一个大的文件目录。我们要访问存储设备中的文件,必须将文件所在的分区挂载到一个已存在的目录上,然后通过访问这个目录来访问存储设备。
挂载需要有挂载源和挂载点。
挂载光驱
在常用挂载目录/mnt下创建一个目录cdrom用来进行挂载:mkdir mnt/cdrom
将挂载源设备/dev/cdrom挂载到该挂载点(/mnt/cdrom)上:mount -t iso9660 -o ro dev/cdrom mnt/cdrom/
其中:-t:文件系统类型,iso9660表示光盘或者光盘镜像;
-o:挂载方式,ro表示以只读方式,loop表示把挂载的设备当做一个磁盘分区挂载光盘镜像文件(.iso文件)
准备一个镜像文件:CentOS-7-x86_64-DVD-1908.iso 再准备一个挂载目录:mkdir mnt/centosmount -t iso9660 -o loop root/CentOS-7-x86_64-DVD-1908.iso mnt/centos
挂载的资源在重启后即失效,需要重新挂载。要想自动挂载,可以将挂载信息设置到/etc/fstab配置文件中,如下:
/dev/cdrom mnt/cdrom iso9660 defaults 0 0
/root/CentOS-7-x86_64-DVD-1908.iso mnt/centos iso9660 defaults,ro,loop 0 0
这样的话,重启之后则会进行自动挂载。
第一列:/dev/cdrom:挂载源,要挂在的磁盘分区或者存储设备,或者文件系统 第二列:/mnt/cdrom:挂载点,挂载位置 第三列:iso9660:文件系统类型,ext4文件系统,swap表示交换分区,…… 第四列:defaults:挂载参数 第五列:0:表示dump选项,dump工具通过这个选项位置上的数字来决定文件系统是否需要备份。如果是0,dump就会被忽略,事实上大多数的dump设置都是0 第六列:0:读取文件系统时候的检查顺序,允许的数字是0,1,2,根目录应当获得最高的优先权 1, 其它所有需要被检查的设备设置为2,0表示不检查
把CentOS-7-x86_64-DVD-1908.iso镜像自动发布到httpd服务中
开启httpd服务 systemctl start httpd挂载CentOS-7-x86_64-DVD-1908.iso到/mnt/cdrom mount –t iso9660 –o ro dev/cdrom mnt/cdrom创建软链到/var/www/html/中 ln -s mnt/cdrom var/www/html/cdrom检查 df -h 或者 du -sh mnt/cdrom/Packages
卸载挂载unmount mnt/cdrom
系统时间查询
$ date -R
Sun, 22 Nov 2020 11:05:20 +0800
$ date
Sun Nov 22 11:05:30 CST 2020
$ date '+%Y-%m-%d %H:%M:%S'
2020-11-22 11:05:45
系统时区
CentOS中时区是以文件形式存在,当前正在使用的时区文件位于/etc/localtime;
其他时区文件则位于/usr/share/zoneinfo;
其中中国时区使用/usr/share/zoneinfo/Asia/Shanghai。
更改时区cp usr/share/zoneinfo/Asia/Shanghai etc/localtime
如果没有Asia/Shanghai时区文件,使用tzselect命令去生成时区文件,生成好的时区文件就在/usr/share/zoneinfo目录下
修改系统时间
使用date -s '2020-11-22 11:10:30'
修改时间
系统时间校准
# 需要root权限
# ntpdate ntp.sjtu.edu.cn
# ntpdate cn.pool.ntp.org
系统时间自动校准
可以使用crontab -e
编写定时任务自动校准
值得注意的是,之前都是用ntp服务作为不同节点间的时钟同步,现在centos7默认是使用Chrony。
chrony is a versatile implementation of the Network Time Protocol (NTP).
https://chrony.tuxfamily.org/
18. Linux软件安装
在Linux操作系统中,安装软件的方式,主要有以下四种:
二进制发布包的方式
以安装jdk,tomcat举例,tar zxvf xxxx
直接解压即可,可以配置相应环境变量rpm包离线安装
以安装mysql举例,rpm -ivh xxxx
即可,注意前后依赖YUM在线安装
以安装ntpdate,nc,netstat,httpd举例,yum -y install xxx源码编译安装
以安装redis举例,进入源码目录,./configure --prefix=/usr/xxx --enable-ccc && make && make install
rpm
RPM现在是RPM Package Manager的缩写。
RPM最早是由Red Hat公司提出的软件包管理标准,但是其原始设计理念是开放式的,现在包括RedHat、CentOS、SUSE等Linux的分发版本都有采用,后来随着版本的升级又融入了许多其他的优秀特性,成为了Linux中公认的软件包管理标准。
由RPM社区负责维护,可以登录到RPM的官方站点查询最新的信息:http://www.rpm.org/
优点:使用简单,只需要几个命令就可以实现包的安装、升级、查询、卸载;安装速度快;
缺点:不能看源代码;功能选择不如源代码灵活;依赖性;
rpm的安装命令格式: rpm -ivh 包全名
选项: -i(install) 安装 -U 升级 -a 冲突
-v(verbose) 显示详细信息 -e 卸载
-h(hash) 使用“#”显示进度 -q 查询
--force 强制安装,即使覆盖属于其他包的文件也要安装
--nodeps 不检测依赖性
最佳实践:
rpm -ivh
安装rpm -qa
查询rpm -e --nodeps
卸载
yum
Yum(Yellow dog Updater, Modified)是一个在CentOS和RedHat以及SUSE中的Shell前端软件包管理器。比如软件已经以RPM规范打包,但发布在了网络上的一些服务器上,可用yum在线安装服务器上存在的rpm软件,并且会自动解决软件安装过程中的库依赖问题(注:类似于java体系中的maven),yum提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。
yum仓库服务器本质上就是一台http服务器,服务器的目录中放置了rpm包,及rpm包的索引信息文件,即可为yum客户端提供rpm文件下载。
安装示例:yum install -y nc
yum命令工具使用举例
yum update
升级系统yum install ~
安装指定软件包yum update ~
升级指定软件包yum remove ~
卸载指定软件
配置本地yum源
检查YUM源: yum repolist
$ yum repolist
Loaded plugins: fastestmirror
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
Determining fastest mirrors
* base: mirrors.aliyun.com
* epel: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
repo id repo name status
!base/7/x86_64 CentOS-7 - Base 9,363
!epel/x86_64 Extra Packages for Enterprise Linux 7 - x86_64 11,882
!extras/7/x86_64 CentOS-7 - Extras 451
!updates/7/x86_64 CentOS-7 - Updates 2,146
repolist: 23,842
安装好httpd服务
挂载带有很多rpm软件安装包的
iso镜像到/mnt/cdrom创建软链:
ln -s mnt/cdrom/ var/www/html/centos7
这样,就能在httpd服务中访问到iso中的rpm文件了。地址:http://host:80/centos7将本地http服务器加入repo地址
首先:将内置的源全部disable掉cd etc/yum.repos.d/
再执行rename .repo .repo.bak *
然后:新建一个repo源:vi CentOS7-Local-Minal.repo
加入以下内容:
[CentOS7-Local]
name=CentOS7-Local
baseurl=http://192.168.168.188/centos7
gpgcheck=0
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
再次检查,看是否生效: yum repolist
YUM安装的时候默认从redhat官网下载对应的rpm软件安装包,如果网络不通畅,则要么配置本地YUM源,要么可以更改YUM源为国内的一些大型企业,比如网易的或者阿里云的等等。
源码编译安装
优点:开源;可以自由选择所需功能;可看源代码;卸载方便(直接删除安装位置); 缺点:安装步骤过多;编译时间过长
19. Linux进程管理
进程是程序的执行过程,是一个程序在其自身的虚拟地址空间中的一次执行活动,相对于程序,进程是动态的,在linux系统中,它与用户权限相关,程序与进程并没有一一对应,一个程序可能对应多个进程。
进程的类型
交互进程:由一个Shell启动的进程。交互进程既可在前台运行,也以在后台运行。 批处理进程:不与特定的终端相关联,提交到等待队列种顺序执行的进程。 守护进程(Daemon):在Linux在启动时初始化,一直运行于后台的进程。
进程的启动方式
手工启动 调度启动
守护进程
守护进程是在计算机启动时就被运行的,并在系统中持续运行的进程,它等待着随时为客户提供自身负责的服务。由于此类程序运行在后台,除非程序异常终止或者人为终止,否则它们将一直运行下去直至系统关闭。所以,我们将此类提供服务功能的程序称为守护进程。Linux的守护进程(Daemon)在Windows系统中被称作“服务”。
查看系统当前运行的守护进程:pstree
$ pstree
systemd─┬─AliYunDun───22*[{AliYunDun}]
├─AliYunDunUpdate───3*[{AliYunDunUpdate}]
├─agetty
├─aliyun-service
├─crond
├─dbus-daemon
├─firewalld───{firewalld}
├─java───19*[{java}]
├─mysqld_safe───mysqld───35*[{mysqld}]
├─nginx───nginx
├─ntpd
├─php-fpm───6*[php-fpm]
├─polkitd───5*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd─┬─3*[sshd───sshd───bash]
│ ├─sshd───sshd───bash───sudo───su───bash
│ ├─sshd───sshd───bash───pstree
│ └─sshd───sshd
├─systemd-journal
├─systemd-logind
└─systemd-udevd
守护进程的工作原理: 守护进程的工作就是打开一个端口,并且等待并监听(Listen)进入的连接。如果客户提请了一个连接,守护进程就创建(fork)子进程来响应此连接,而父进程继续监听更多的服务请求。因此,每个守护进程都可以处理多个客户服务请求。
pstree命令
以树状形式显示进程;如果没有该命令,则需要安装yum install psmisc -y
进程状态
子进程与父进程:一个进程产生另外一个进程,产生的进程称为子进程,生成另外一个进程的进程称为父进程。

常用命令ps
ps命令用于报告当前系统的进程状态。
ps 命令常用选项包括:
a显示所有用户的进程 u显示用户名和启动时间 x显示所有进程,包括没有控制终端的进程 e显示所有进程,包括没有控制终端的进程,较x选项,信息更为简略 l显示进程详细信息,按长格式显示 f显示进程树
ps -au
显示所有用户进程,并给出用户名和启动时间等详细信息ps -aux
显示所有用户进程,包括没有控制终端的进程,并给出用户和启动细节等详细信息ps -el
按长格式显示进程详细信息
常用命令kill/pidof/pkill
为什么要杀死进程?
该进程占用了过多的CPU时间或超出运行时间 该进程锁住了一个终端,使其他前台进程无法运行 运行时间过长,但没有预期效果 产生了过多到屏幕或磁盘文件的输出 无法正常退出
kill pid
直接杀死进程,但不能保证一定能杀死kill -9 pid
强制杀死进程pidof
命令用于查看某个进程的进程号(例如:pidof mysqld
)
$ pidof mysqld
1388
pkill
命令可以按照进程名杀死进程。pkill和killall应用方法差不多,也是直接杀死运行中的程序;如果想杀掉单个进程,请用kill来杀掉。
进程切换
前台进程指的是进程在执行时会将命令行阻塞,直到进程执行完毕;后台进程指的是进程在执行时不会阻塞当前命令行,而是在系统后台执行
ctrl + c
终止进程ctrl + z
挂起进程fg
命令将进程转换到前台执行bg
命令将进程转换到后台执行jobs
命令查看任务
内存管理top/free
top
命令可以定期显示所有正在运行和实际运行并且更新到列表中,它显示出 CPU 的使用、内存的使用、交换内存、缓存大小、缓冲区大小、过程控制、用户和更多命令。它也会显示内存和 CPU 使用率过高的正在运行的进程。
$ top
top - 12:40:05 up 1035 days, 3:48, 6 users, load average: 0.01, 0.04, 0.05
Tasks: 100 total, 1 running, 99 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1016784 total, 67020 free, 627808 used, 321956 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 178096 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
15764 root 10 -10 142236 17220 4392 S 0.7 1.7 391:53.05 AliYunDun
1388 mysql 20 0 1120104 205260 24 S 0.3 20.2 436:23.16 mysqld
10367 root 20 0 2350684 279972 448 S 0.3 27.5 302:27.24 java
free
$ free -h
total used free shared buff/cache available
Mem: 992M 612M 66M 50M 314M 174M
Swap: 0B 0B 0B
20. Linux定时任务
crontab
crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]
参数说明:
-u user:用来设定某个用户的crontab服务,例如,”-u ixdba”表示设定ixdba用户的crontab服务,此参数一般有root用户来运行。
file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。
-e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。
-l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。
-r:删除定时任务配置,从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户crontab文件。
-i:在删除用户的crontab文件时给确认提示。
必须掌握:
# 列出用户目前的crontab
crontab -l [-u user]
# 编辑用户目前的crontab
crontab -e [-u user]
补充:通过crontab添加的计划任务都会存储在 /var/spool/cron/ 目录里
crontab详细配置
详细配置信息:cat etc/crontab
$ cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
#0 23 27 * * root ./opt/nginx/sbin/nginx -s stop
#0 23 28 * * root ./certbot renew --quiet
#0 23 29 * * root /opt/nginx/sbin/nginx -c /opt/nginx/conf/nginx.conf
基本格式 :
* * * * * command
分 时 日 月 周 命令
第1列表示分钟0~59 每分钟用*或者 */1表示
第2列表示小时0~23(0表示0点) 7-9表示:8点到10点之间
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
示例
# 表示每分钟执行一次date命令
*/1 * * * * date >> /root/date.txt
# 表示每晚的21:30重启apache
30 21 * * * system restart httpd
# 表示每月1、10、22日的04:45重启apache
45 4 1,10,22 * * system restart httpd
# 表示每周六、周日的1:10重启apache
10 1 * * 6,0 system restart httpd
# 表示在每天18:00至23:00之间每隔30分钟重启apache
0,30 18-23 * * * system restart httpd
# 晚上11点到早上7点之间,每隔一小时重启apache
* 23-7/1 * * * system restart httpd
# 每月的4号与每周一到周三的11点重启apache
0 11 4 * mon-wed system restart httpd
21. Linux高级文本处理命令
wc sort uniq cut find grep sed awk
wc
功能:统计文件行数、字节、字符数
$ wc --help
Usage: wc [OPTION]... [FILE]...
or: wc [OPTION]... --files0-from=F
Print newline, word, and byte counts for each FILE, and a total line if
more than one FILE is specified. With no FILE, or when FILE is -,
read standard input. A word is a non-zero-length sequence of characters
delimited by white space.
The options below may be used to select which counts are printed, always in
the following order: newline, word, character, byte, maximum line length.
-c, --bytes print the byte counts
-m, --chars print the character counts
-l, --lines print the newline counts
--files0-from=F read input from the files specified by
NUL-terminated names in file F;
If F is - then read names from standard input
-L, --max-line-length print the length of the longest line
-w, --words print the word counts
--help display this help and exit
--version output version information and exit
GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
For complete documentation, run: info coreutils 'wc invocation'
统计文件信息: wc wc.txt统计字符串长度: echo "hello" | wc -L统计文件行数: wc -l mingxing.txt统计文件字数: wc -w mingxing.txt
sort
功能:排序文本,默认对整列有效
$ sort --help
Usage: sort [OPTION]... [FILE]...
or: sort [OPTION]... --files0-from=F
Write sorted concatenation of all FILE(s) to standard output.
常用可选项:
-f:忽略字母大小写,就是将小写字母视为大写字母排序
-M:根据月份比较,比如 JAN、DEC
-h:根据易读的单位大小比较,比如 2K、1G
-g:按照常规数值排序
-n:根据字符串数值比较
-r:倒序排序
-k:位置1,位置2根据关键字排序,在从第位置1开始,位置2结束
-t:指定分隔符
-u:去重重复行
-o:将结果写入文件
测试一下:
准备数据:sort.txt
# 原始文本,注意顺序
$ cat sort.txt
aaa:10:1.1
ccc:20:3.3
bbb:40:4.4
eee:40:5.5
ddd:30:3.3
bbb:40:4.4
fff:30:2.2
直接排序,把整行当做一列字符串,字典顺序
# 直接排序,需要注意原始文本内容并没有发生改变
$ sort sort.txt
aaa:10:1.1
bbb:40:4.4
bbb:40:4.4
ccc:20:3.3
ddd:30:3.3
eee:40:5.5
fff:30:2.2
以:作为分隔符,取第二个字段按照数值进行排序
$ sort -nk 2 -t : sort.txt
aaa:10:1.1
ccc:20:3.3
ddd:30:3.3
fff:30:2.2
bbb:40:4.4
bbb:40:4.4
eee:40:5.5
和上一个不一样的是-u为了去重
$ sort -nk 2 -u -t : sort.txt
aaa:10:1.1
ccc:20:3.3
ddd:30:3.3
bbb:40:4.4
多列排序:以:分隔,按第二列数值排倒序,第三列正序
$ sort -n -t: -k2,2r -k3 sort.txt
bbb:40:4.4
bbb:40:4.4
eee:40:5.5
fff:30:2.2
ddd:30:3.3
ccc:20:3.3
aaa:10:1.1
uniq
功能:去除重复行,只会统计相邻的
$ uniq --help
Usage: uniq [OPTION]... [INPUT [OUTPUT]]
Filter adjacent matching lines from INPUT (or standard input),
writing to OUTPUT (or standard output).
常用选项:
-c:打印出现的次数
-d:只打印重复行
-u:只打印不重复行
-D:只打印重复行,并且把所有重复行打印出来
-f N:比较时跳过前N列
-i:忽略大小写
-s N:比较时跳过前N个字符
-w N:对每行第N个字符以后内容不做比较
测试一下:
准备数据:
$ cat uniq.txt
abc
xyz
cde
cde
xyz
abd
直接去重,只能在相邻行去重:
uniq uniq.txt先给文件排序,然后去重:
sort uniq.txt | uniq打印每行重复次数:
sort uniq.txt | uniq –c打印不重复行,并给出次数:
sort uniq.txt | uniq -u –c打印重复行,并给出次数:
sort uniq.txt | uniq -d -c以开头前两个字符去重:
sort uniq.txt | uniq -w 2准备两份数据做交并差
# 文本a
$ cat a.txt
a
b
c
d
# 文本b
$ cat b.txt
c
d
e
f
求两个文件的交集: cat a.txt b.txt | sort | uniq –d求两个文件的并集: cat a.txt b.txt | sort | uniq求a.txt和b.txt的差集: cat a.txt b.txt b.txt | sort | uniq –u求b.txt和a.txt的差集: cat b.txt a.txt a.txt | sort | uniq -u
cut
cut命令可以从一个文本文件或者文本流中提取文本列
$ cut --help
Usage: cut OPTION... [FILE]...
Print selected parts of lines from each FILE to standard output.
# cut语法
# 用于有特定分隔字符
cut -d'分隔字符' -f fields
# 用于排列整齐的信息
cut -c 字符区间
选项与参数:
-d:后面接分隔字符。与 -f 一起使用
-f:依据 -d的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思
-c:按照字符截取
-b:按照字节截取
首先看PATH变量:
$ echo $PATH
/opt/jdk1.8.0_101/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
将PATH变量取出,找出第2个路径:
$ echo $PATH | cut -d ':' -f 2
/usr/local/bin
将PATH变量取出,找出第2和第3个路径,以下三种方式都OK
$ echo $PATH | cut -d ':' -f 2,3
/usr/local/bin:/usr/bin
$ echo $PATH | cut -d : -f 2,3
/usr/local/bin:/usr/bin
$ echo $PATH | cut -d: -f2,3
/usr/local/bin:/usr/bin
将PATH变量取出,找出第三到最后一个路径
$ echo $PATH | cut -d ':' -f 3-
/usr/bin:/usr/local/sbin:/usr/sbin
将PATH变量取出,找出第一到第三,还有第五个路径
$ echo $PATH | cut -d ':' -f 1-3,5
/opt/jdk1.8.0_101/bin:/usr/local/bin:/usr/bin:/usr/sbin
find
功能:搜索文件目录层次结构;
$ find --help
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
default path is the current directory; default expression is -print
常用可选项:
-name 根据文件名查找,支持('* ' , '? ')
-type 根据文件类型查找(f-普通文件,c-字符设备文件,b-块设备文件,l-链接文件,d-目录)
-perm 根据文件的权限查找,比如 755
-user 根据文件拥有者查找
-group 根据文件所属组寻找文件
-size 根据文件小大寻找文件
-o 表达式 或
-a 表达式 与
-not 表达式 非
查找文件名txt结尾的文件:
find /root/txt/ -name "*.txt"忽略大小写查找文件名包含linux:
find /root/txt -iname "*linux*"查找文件名结尾是.txt或者.jpg的文件:
find /root/txt/ \( -name "*.txt" -o -name "*.jpg" \)find /root/txt/ -name "*.txt" -o -name "*.jpg"使用正则表达式的方式去查找上面条件的文件:
find /root/txt/ -regex ".*\(\.txt\|\.jpg\)$"查找.jpg结尾的文件,然后删掉
find /root/txt -type f -name "*.jpg" -delete
grep
grep是一种强大的文本搜索工具,他能使用正则表达式搜索文本,并把匹配的行统计出来,过滤数据流或文件内容。
$ grep --help
Usage: grep [OPTION]... PATTERN [FILE]...
Search for PATTERN in each FILE or standard input.
命令:grep [选项] [–color=auto] "搜索字符串" filename
常用参数:
-c:统计符合条件的字符串出现的总行数。
-E:支持扩展正则表达式。
-i:忽略字符大小写。
-n:在显示匹配到的字符串前面加上行号。
-v:显示没有”搜索字符串”内容的那一行。
-l:列出文件内容中有搜索字符串的文件名称。
-o:只输出文件中匹配到的部分。
-color=auto:将匹配到的字符串高亮出来。
sed
sed叫做流编辑器,在shell脚本和Makefile中作为过滤一使用非常普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换成为另一种格式输出。sed是一种在线编辑器,它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间",接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
选项:
-n:一般sed命令会把所有数据都输出到屏幕,如果加入-n选项的话,则只会把经过sed命令处理的行输出到屏幕。
-e:允许对输入数据应用多条sed命令编辑。
-i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出。
awk
awk是一个强大的处理文本的编程语言工具,其名称得自于它的创始人Alfred Aho、Peter Weinberger和Brian Kernighan 姓氏的首个字母,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。AWK 提供了极其强大的功能:可以进行样式装入、流控制、数学运算符、进程控制语句甚至于内置的变量和函数。简单来说awk就是扫描文件中的每一行,查找与命令行中所给定内容相匹配的模式。如果发现匹配内容,则进行下一个编程步骤。如果找不到匹配内容,则继续处理下一行。
日期时间
date - print or set the system date and time;
linux系统为我们提供了一个命令date
,专门用来显示或者设置系统日期时间的。
- END -$ date --help
Usage: date [OPTION]... [+FORMAT]
or: date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
语法格式为:
date [OPTION]... [+FORMAT] 或者
date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]
常用的可选项有:
--help:显示辅助信息
--version:显示date命令版本信息
-u:显示目前的格林威治时间
-d:做日期时间相关的运算
--date='-dateStr':做日期时间的相关运算




