暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

大数据基础:Linux操作系统(下)

大数据真有意思 2020-11-22
320

点击关注上方“知了小巷”,

设为“置顶或星标”,第一时间送达干货。

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压缩(打包)和解压缩


  1. gzip压缩:gzip ma.txt
  2. gzip解压缩:gzip -d ma.txt.gz
    或者 gunzip ma.txt.gz
  3. bzip2压缩:bzip2 ma.dat
  4. bzip2解压缩:bzip2 -d ma.dat.bz2
    或者 bunzip2 ma.dat.bz2
  5. 打包:tar -cvf ma.txt.tar ma.txt
  6. 追加打包:tar -rvf ma.txt.tar ma.dat
    表示将ma.dat文件追加到ma.txt.tar当中
  7. 解包:tar -xvf ma.txt.tar
  8. 打包并压缩:tar -zcvf ma.tar.gz root/ma/
  9. 解包并解压缩:tar -zxvf ma.tar.gz
  10. 查看压缩包内容:tar -ztvf ma.tar.gz
  11. 打包并压缩成bz2:tar -jcvf a.tar.bz2
  12. 解压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中状态:

  1. enabled 安装了的,并会随系统启动而启动。
  2. static Enabled服务启动时需要同时启动的依赖服务。
  3. disabled 已安装,但不可随系统启动而同时启动的服务。
  4. 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操作系统将所有的设备都看作文件,它将整个计算机的资源都整合成一个大的文件目录。我们要访问存储设备中的文件,必须将文件所在的分区挂载到一个已存在的目录上,然后通过访问这个目录来访问存储设备。

挂载需要有挂载源和挂载点

  1. 挂载光驱
    在常用挂载目录/mnt下创建一个目录cdrom用来进行挂载:mkdir mnt/cdrom
    将挂载源设备/dev/cdrom挂载到该挂载点(/mnt/cdrom)上:mount -t iso9660 -o ro dev/cdrom mnt/cdrom/
    其中:-t:文件系统类型,iso9660表示光盘或者光盘镜像;
    -o:挂载方式,ro表示以只读方式,loop表示把挂载的设备当做一个磁盘分区

  2. 挂载光盘镜像文件(.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服务中

  1. 开启httpd服务systemctl start httpd
  2. 挂载CentOS-7-x86_64-DVD-1908.iso到/mnt/cdrommount –t iso9660 –o ro dev/cdrom mnt/cdrom
  3. 创建软链到/var/www/html/中ln -s mnt/cdrom var/www/html/cdrom
  4. 检查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操作系统中,安装软件的方式,主要有以下四种:

  1. 二进制发布包的方式
    以安装jdk,tomcat举例,tar zxvf xxxx
    直接解压即可,可以配置相应环境变量

  2. rpm包离线安装
    以安装mysql举例,rpm -ivh xxxx
    即可,注意前后依赖

  3. YUM在线安装
    以安装ntpdate,nc,netstat,httpd举例,yum -y install xxx

  4. 源码编译安装
    以安装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源

  1. 检查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

  1. 安装好httpd服务

  2. 挂载带有很多rpm软件安装包的
    iso镜像到/mnt/cdrom

  3. 创建软链:ln -s mnt/cdrom/ var/www/html/centos7

    这样,就能在httpd服务中访问到iso中的rpm文件了。地址:http://host:80/centos7

  4. 将本地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

  1. 再次检查,看是否生效:yum repolist

YUM安装的时候默认从redhat官网下载对应的rpm软件安装包,如果网络不通畅,则要么配置本地YUM源,要么可以更改YUM源为国内的一些大型企业,比如网易的或者阿里云的等等。

源码编译安装

  • 优点:开源;可以自由选择所需功能;可看源代码;卸载方便(直接删除安装位置);
  • 缺点:安装步骤过多;编译时间过长

19. Linux进程管理


进程是程序的执行过程,是一个程序在其自身的虚拟地址空间中的一次执行活动,相对于程序,进程是动态的,在linux系统中,它与用户权限相关,程序与进程并没有一一对应,一个程序可能对应多个进程

  1. 进程的类型
  • 交互进程:由一个Shell启动的进程。交互进程既可在前台运行,也以在后台运行。
  • 批处理进程:不与特定的终端相关联,提交到等待队列种顺序执行的进程。
  • 守护进程(Daemon):在Linux在启动时初始化,一直运行于后台的进程。
  1. 进程的启动方式
  • 手工启动
  • 调度启动

守护进程

守护进程是在计算机启动时就被运行的,并在系统中持续运行的进程,它等待着随时为客户提供自身负责的服务。由于此类程序运行在后台,除非程序异常终止或者人为终止,否则它们将一直运行下去直至系统关闭。所以,我们将此类提供服务功能的程序称为守护进程。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 命令常用选项包括:

  1. a显示所有用户的进程
  2. u显示用户名和启动时间
  3. x显示所有进程,包括没有控制终端的进程
  4. e显示所有进程,包括没有控制终端的进程,较x选项,信息更为简略
  5. l显示进程详细信息,按长格式显示
  6. f显示进程树
  • ps -au
    显示所有用户进程,并给出用户名和启动时间等详细信息
  • ps -aux
    显示所有用户进程,包括没有控制终端的进程,并给出用户和启动细节等详细信息
  • ps -el
    按长格式显示进程详细信息

常用命令kill/pidof/pkill

为什么要杀死进程?

  • 该进程占用了过多的CPU时间或超出运行时间
  • 该进程锁住了一个终端,使其他前台进程无法运行
  • 运行时间过长,但没有预期效果
  • 产生了过多到屏幕或磁盘文件的输出
  • 无法正常退出
  1. kill pid
     直接杀死进程,但不能保证一定能杀死
  2. kill -9 pid
     强制杀死进程
  3. pidof
    命令用于查看某个进程的进程号(例如:pidof mysqld
$ pidof mysqld
1388

  1. pkill
    命令可以按照进程名杀死进程。pkill和killall应用方法差不多,也是直接杀死运行中的程序;如果想杀掉单个进程,请用kill来杀掉。

进程切换

前台进程指的是进程在执行时会将命令行阻塞,直到进程执行完毕;后台进程指的是进程在执行时不会阻塞当前命令行,而是在系统后台执行

  1. ctrl + c
    终止进程
  2. ctrl + z
    挂起进程
  3. fg
    命令将进程转换到前台执行
  4. bg
    命令将进程转换到后台执行
  5. 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
,专门用来显示或者设置系统日期时间的。

$ 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':做日期时间的相关运算

- END -


往期精选

大数据基础:Linux操作系统(上)

Hive数据聚合

Linux中的SSH协议

Apache Kafka客户端KafkaProducer

7问Impala

Hive数据过滤之分区和分桶

Apache Kafka生产环境集群资源规划与配置

入门Apache Kafka需要了解的方方面面

文章转载自大数据真有意思,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论