关机重启注销

shutdown

​ -h now ——立即关机

​ -h 1 ——1min后关机

​ -r now ——立即重启

halt ——直接使用,等价于关机

poweroff ——关机

reboot ——直接使用,重启

sync ——直接使用,关机时内存数据同步到磁盘

修改主机名

hostname name:临时修改,非永久。不建议

cat /etc/hosts:查看主机名

hostnamectl set hostname xxx:永久性更改主机名

vi /etc/hosts:修改配置文件映射关系,永久性

物理主机windows系统可以修改C盘下的system/.../hosts文件修改配置映射关系

用户管理

多用户多任务系统

超级管理员root:UID=0

系统用户(伪用户):UID=1-499

普通用户:UID=500+

使用普通用户登录时,可以用 su root 切换成系统管理员身份

logout 注销当前用户

useradd [options] name

​ options: -d 指定用户目录;-g 用户组 ;-u 指定UID;-s 指定用户登录后使用的shell程序

passwd user:改密码

​ -l/--lock 锁住密码;-u 解锁密码;-d 删除密码;-x days 密码有效期;-w 密码到期前的警告天数;-i 密码到期后的宽限天数;-s 显示密码状态;--stdin 从标准输入读取密码,主要通过脚本批量添加用户

userdel user:删除用户,但是/home下的家目录还在

​ -r 同时删除家目录和邮件

usermod -g group user:用户更换用户组

​ -u -d -s -e(失效日期) -l(修改用户名) -LU加解锁

usermod -G sudo user:默认useradd添加的用户无权使用sudo以root身份执行命令。可以通过该命令将用户添加到sudo附加组

是否要保留家目录?

在删除用户时,一般不删除家目录,家目录里可能包含用户工作时保留的一些源码或文件

用户查看

id [-ugGZ] user:查询用户,如果不存在则返回“无此用户”

whoami & who am i:查看当前用户

who/w:查看当前登录系统的所有用户

tty1-6 本地字符集终端,tty7 本地图形终端

pts/0-255 远程终端

用户切换

su [-lc] user:切换用户(加“-”会有上次登录提示并将shell同步切换)。-l 是切换时包括shell一起切换;-c “指令” 不切换,只是利用目标身份执行一次指令

返回初始用户用exit

sudo -ub [user] command:切换目标身份执行指令

​ -u 使用目标身份;-b 在后台执行指令

su 切换身份是需要知道对方密码的,容易造成密码泄露。

sudo 切换身份无须知道对方密码,只用自己密码即可。但是使用这个命令需要经过管理员审核放权。

预设只有root具有sudo权限

如果两次执行sudo时间间隔在5min内,则不需再输密码,因为系统相信两次执行的是同一个人和作业

/etc/sudoers:sudo权限用户库

可以由root编辑该文件,一般不采用vi/vim编辑,而是用visudo专门编辑该文件,并在编辑结束退出时进行校验

示例: root(使用者) ALL(本机名)=(ALL)(可切换的身份) ALL(可执行的命令)

user1 ALL= /sbin/shutdown -r now ——授权user1切换指root执行重启服务器指令(省略默认是root)

user1 ALL=(root) !/usr/bin/passwd,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root ——授权user1切换至root执行更改其他用户密码,但是不能更改root密码

%wheel ALL=(ALL) NOPASSWD:ALL ——授权wheel用户组所有身份权限,且免密输入

设置用户别名,命令别名

User_Alias ADMPW=user1,user2,user3

Cmnd_Alias ADMPWCOM=!/usr/bin/passwd,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root

ADMPW ALL=(root) ADMPWCOM

用户默认参数配置

/etc/default/useradd

/etc/login.defs

用户当前的shell

chsh -ls [user]:-l 展示系统所有可用shell(== ll /etc/shells) ;-s 设定当前用户所用shell

用户邮箱

/var/spool/mail/

用户模板/etc/skel/

新建用户时,该目录下文件会备份一份到新用户的家目录下

用户组

系统可以对有共性的多个用户进行统一管理

groupadd groupname:创建组

groupdel groupname:删除组。如果是用户的初始组,需要先删除用户或改其GID才能删除组

groupdel groupname:-g 改GID;-n 改组名

newgrp groupname:切换当前用户组

groups userr1 user2 ...看用户所在全部组

组管理

实际生产中,一般是用一个用户给多个开发人员使用

如果管理员忙,可以分配权限给某个用户帮助管理用户组

一般组密码和组管理员功能很少用,完全可以用sudo取代

gpasswd [options] groupname:设置组密码

​ -a/d user 添加删除用户;

​ -A user1,user2,...:添加管理员

​ -M user1,user2,...:添加组成员(覆盖)

​ -r/R 删除密码/密码失效

用户和组的相关文件

用户配置文件(用户信息):/etc/passwd

​ 用户名:口令:用户标识:组标识:注释性描述:主(家)目录:登录的shell

组配置文件(组信息):/etc/group

​ 组名:口令:组标识:组内用户列表

口令配置文件:/etc/shadow。

​ 登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志

用户授权

授权其实就是授予操作文件/目录的权限

-rw-r--r--. 1 root root 56 6月 29 18:56 ccccc.txt

这里-rw-r--r--10位,表示文件相关相关信息。

r表示可读取文件内容或目录下文件

w表示可修改文件或修改目录(目录下创建删除重命名)

x表示可执行文件,或可进入目录

w不表示可以删除文件,文件可删除的前提是获取文件归属目录的的w权

第1位是文件性质:-是文件,d是目录,l是软链接,c是字符设备,键盘鼠标,b是块文件,硬盘

2-4共三位是当前用户所有权限

5-7共3位是当前用户组所有权限

8-10共3位是其他用户所有权限

授权:chmod [options] [权限] sudoers/file -R 递归授权;--reference=RFILE 参考指定文件的权限授权

权限:777 , u+w ,ugo+w a+w, u=r,g=w,a=x , ugo-x

一般文件的创建者即是文件的所有者,但是普通用户不允许修改文件的所有者身份(即使其所有者本人!!!)

ls -alh :查看文件所有者

chown user[:group] file/dir:只能改变所有者[同时改变组]

chgrp [-R] group file/dir :加[-R]递归修改文件

运行级别

0——关机

1——单用户,无须密码通过root登录,可以用来找回密码

2——多用户无网络

3——多用户有网络

4——保留

5——图形界面

6——重启

常用3和5

运行级别配置文件:

init [0123456]:切换指定级别

找回丢失的root密码

进入单用户模式,修改密码

基本指令

快捷键

tab:代码补完

Ctrl+c:放弃当前输入,终止当前任务或程序

Ctrl+l:清屏

帮助

man command

command --help

info command

which command :查看命令所在目录

查看目录

ll [file]:查看竖直列表形式,内容更全

ls [-a][-l][-R]:查看横排列表形式。加-a可以查看隐藏文件,-R包括子目录

pwd:查看当前目录

tree dir:查看树状结构图

切换目录

cd -P path: -P忽视链接,切换到源文件路径

cd - :切换到上次切换前目录

cd .. :切换到当前目录的上级目录

cd ~:回到当前用户的家目录

创建和删除

touch file1 file2 ...:创建新的空文件(如果不存在),如果存在就是修改文件信息

mkdir [-p] directory:创建目录。加-p创建多级目录/保证已有的情况下不报错

rm [-rf] file/*:删除文件/目录。删除目录可能要加-rf 。r递归,f强制

rmdir 效果类似 rm -rf dir:前者删除空目录,后者可以删除带文件目录

clear:清屏

查看文件内容

stat -tf file:查看文件详细的命令。-t 简洁方式输入;-f 显示文件系统状态而非文件状态

cat [-n] file:适合查看小文件,加-n显示行数

nl file == cat -n file

tac file:与cat相反,从文末开始显示

more [options] file:适合大文件,可以实时显示阅读百分比,空格/回车往下翻页。加-f 给出行号

less [options] file:查看文件[前n条],效率高于more

配合链式:cat file | more [分页浏览]

head -n num file:查看前num行

tail tailf

tail [-n/-f/-F] file:与head相反,从后往前。-f 用于阅读正在改变的日志文件,实时监控;-s 刷新间隔,默认3s;--pid=PID 指定进程结束则查看结束;-F 根据文件名追踪,如果文件不存在会创建文件;-n 查看最后n行;-c 查看最后xxx字节数

tailf = tail -f -n 10:但是不同于后者。它是相当于懒加载 ,如果文件不变化,则不会轻易去刷新访问,很适合便携机中跟踪日志文件,减少了文件访问

复制

cp file1 [file2 ...] dir-file:复制文件

cp -r file/dir dir:可以复制非空目录,递归复制源,提示是否覆盖

\cp -r file/dir dir:强制覆盖

mv oldfile newfile:移动/改名。统一目录则改名,不同目录则移动

链接

ln [-s] file dir:给源文件加一个链接到另一个目录。加-s是软链接,会显示链接方式,但是事实上使用的还是同一个文件;不加-s,硬链接,赋值一个副本,但是副本与源文件同步

追加&覆盖 输出字符串+变量

echo [-e] string:echo是用于字符串或变量的显示/输出。也可以显示转义字符;不想转义用单引号;输出命令执行结果用反引号

echo $var:通过echo读取变量

echo 默认换行。加 -n 解除默认换行,加-e开启转义模式(可以借\n)

echo string > file:覆盖

echo string >> file:追加

|:管道,相当于链式操作

cat xxx.txt >> xxxx.txt:查看并追加

cat xxx.txt | grep yyyy >> xxxx.txt :查看过滤并追加

cat >/>> file << EOF:两方夹击,同时进行输入数据,当然是否追加还是覆盖看左边,EOF只是一个代言,可以是任何代码,可以是ABC,也可以是BCD,无需多言,EOF是从控制台输入数据到文件中,以EOF结束输入

2> 错误信息覆盖,相当于System.err.out

2>> 错误信息追加

筛选

grep:筛选数据,一般集合管道|使用options

​ -n 显示匹配行及行号

​ -i 忽略大小写

​ -v 反向筛选,找出无关键字的所有行

​ -w 匹配整个单词

​ -r 搜索范围为当前目录及子目录

支持正则表达式

运算符

cmmand1 && command2:命令1执行成功则执行命令2

command1 || command2:命令1执行失败才执行命令2

统计

wc -l file:统计文件的行数

-w 单词数

-l 总长度

-L 最大行长度

日志记录

history:查看当前用户本次登录下使用了哪些命令

history num:查看最近num条历史指令

!num:查看编号为num的历史指令

安装

文件相关

文件搜索

模糊查询+精确查询,一般根据name在指定目录下搜索

find --help

find [dir] -name filename:指定目录下查询,也可以进入指定文件夹下进行查询

​ -size +20M:根据大小查找 (案例查找大于20M)

​ -user user:工具文件拥有者查找

模糊查询:filename = "*.txt" 全名模糊查询,文件

​ filename = "a*" a打头模糊查询,文件+文件夹

​ filename = "*ab" 包含ab模糊查询,文件+文件夹

locate:centOS7没有此命令

可以快速定位文件路径,他可以利用事先建立起来的关于系统中所有文件名及路径的locate数据库进行快速定位。locate无须遍历整个文件系统,所以查询速度快,但是管理员需要定期更新locate库保证查询准确度

locate file

首次使用前必须使用updatedb指令创建数据库

解压缩

常用压缩包后缀如.gz .tar .zip等

tar -cvf 压缩包名 被打包内容1 被打包内容2 ... :打包命令。

​ -z (使用gzip解压缩)打包并压缩 .tar.gz

​ -j (使用bzip2解压缩) tar.bz2

​ -c 产生.tar打包文件

​ -v 显示详细信息

​ -f 指定打包后的文件名

​ -x 解析.tar文件

压缩命令 [options] 压缩包 [待压缩文件]

解压命令 压缩包 [-d/-C] 解压目录

tar [-xvf / -zxvf ] 压缩包名 [-C dir]:解压命令,(-C支持解压到其他目录),xvf要与压缩时使用的cvf对应

gzip gunzip:压缩后源文件删除,解压也是如此

unzip xxx.zip [-d dir]:解压zip文件(-d支持其他目录)

zip rar unrar bzip2 bunzip2

压缩参数:-r 递归;-m 删除源文件;-v 显示压缩过程;-q 不显示过程;-压缩级别 1-9,从速度快到压缩效果好;-u 更新压缩文件,往已有的压缩文件添加新文件

zip、unzip命令可能需要下载:yum -y install unzip

vi/vim编辑器

后者是前者的升级版。二者支持对linux下的任何文件的编辑。

vim支持直接创建文件。

vim file +line:直接定位到指定行数位置,如只有+,则定位值文件末尾。

网络设置

ip addr/ipconfig:查看当前系统的Internet信息

netstat -anpult:查看本机端口和客户端连接 (先安装net-snmp和net-tools)

ping url:查看当前网络连接情况

service network restart/systemctl start network.service:重启网卡服务

通信

write 用户名 [终端编号] :向指定登录用户终端上发送信息,Ctrl+C表示信息传送结束

wall information:群发信息。

系统日志命令

系统中有一批重要的痕迹日志文件/etc/log/wtmp , /var/run/utmp , /var/log/btmp , /var/log/lastlog 等都是二进制文件,如果试图通过vi/vim编辑器打开,会发现乱码。因为需要保证这些系统信息安全

w [-husf] user:查看/var/run/utmp,显示登陆用户及其正在执行的指令。-h 不打印头信息;-u 显示时忽略用户名;-s 短输出格式;-f 显示用户登录地点

who [-Hqwu] file:类似w,默认查看/var/run/utmp,但内容更简单。 -H 显示各栏位标题信息;-q 只显示当前登录的账号名及总人数;-w 显示用户信息状态栏;-u 显示闲置时间如果用户1min内无动作会被表示"."24h无动作被标识"old"

last [-adfnRx] user/terminal:查看历史登录信息,包括当前已登录。查看/var/log/wtmp。-a 主机名/ip置于最后;-d ip转主机名;-f 指定记录文件;-n 指定显示列数;-R 不显示主机名/ip;-x 显示系统关机/重启等动作

lastlog [-btu]:查看所有用户最后一次登录记录,查看/etc/log/lastlog。-b<天数> 显示几天前的登录信息;-t<天数> 显示最近几天的信息;-u 显示指定用户的登录信息

lostb [-adfnRx] user/terminal:查看错误登录信息,/var/log/btmp。

时间

date

cal:看日历 加-y查看一年日历

格式化:date +"options" %Y %m %d %H %M %S

设置系统时间:date -s “.....”

转换字符串/计算日期:date -d "日期字符串"

​ date -d "1 day ago"

​ date -d "-1 day"

查看进程(重点)

sshd进程是远程登录进程,port = 22

进程通常分为前台进程和后台进程。前台是用户能看见并操作的,后台是看不到但实际上工作的。一般系统的服务都是后台进程,且常驻系统中,伴随系统关闭

PID TTY(终端机号)

TIME(当前进程消耗CPU时间)

CMD(正在执行的命令或进程名)

pstree -pu:-p PID -u User

ps -ef | grep xxx:可以查看父进程

ps -ef | grep redis

ps -aux | more / grep process/user/xxx:更全,有CPU和memory使用情况 VSZ 占虚拟内存 RSS 占物理内存

​ -a 显示所有进程信息

​ -u 用户格式显示进程信息

​ -x 显示后台进程运行参数

kill [-num] PID

​ -9 强制关闭

​ -15 操作系统通知应用进程需要关闭

killall pname:一次性关闭多个相关进程

yarn top:查看yarn相关的top进程

free:查看汇总情况

服务管理

服务本质就是进程,但是运行在后台,通常需要监听某个端口,等待其他程序请求,因此又称守护进程(重要)

service 服务/进程 start/stop/reload/status

systemctl start/stop/reload/status 服务/进程

这是临时生效的,重启后还是回到原来的设置

查看系统服务:setup+回车(面向图形用户界面)

​ netstat -pnltu (也可以看端口占用情况)

​ systemctl list-unit-files

​ systemctl | more

​ systemctl list-units --type service

​ systemctl | grep "apache2"

​ vim /etc/services

systemctl status sshd

systemctl is-active sshd

systemctl is-enabled sshd

​ chkconfig --list

ll /etc/init.d/

查看修改服务级别(对应运行级别):vi /etc/inittab

给每个运行级别设置自启动/默认关闭:(重启才能生效)

​ chkconfig --level 运行级别 服务名 on/off

服务监控

top [-dip]:动态显示进程

​ -d seconds 刷新间隔,默认3s;-i 不显示闲置/僵死进程;-p 指定监控进程ID

​ 按U按钮选择监控的user

​ 按K选择需要结束的进程

​ 按P则根据CPU使用情况排序

​ 按M根据内存排序

​ 按N根据PID排序

​ 按q 退出

监控端口(网络服务)情况

需要安装 net-tools

netstat -nultp

netstat [options]: -an 按一定顺序;-p 显示被哪个进程调用

nc -l portID :占用端口号

kill -9 ...?

查看磁盘空间

df -h

df -H

分区处理

mbr分区:最多4个主分区,系统只在主分区,扩展分区占一个主分区,最大2TB,良好兼容性

gtp分区:无限主分区,收到OS限制,最大18EB

Linux的结构其实是一个文件结构,对标磁盘分区就是每个分区对应一个 目录,这个联系称作载入(mount),断连就叫卸载

Linus硬盘分为IDE和SCSI,目前基本上是后者

两者区别在于前者用hd标识分区,后者用sd标识

1-4主分区或扩张分区,5+是逻辑分区

lsblk [-f]

经典案例:给Linux系统增加一个新的硬盘并挂载到/home/newdisk下

1、虚拟机添加硬盘,reboot

2、分区 fdisk /dev/sdb

3、格式化 mkfs -t ext2 /dev/sdb1

4、挂载 :创建目录,挂载 ——mount 磁盘 目录

5、4是临时挂载,重启将失效,现在设置自动挂载

​ vim /etc/fstab

​ ....?

查看磁盘目录占用情况

tree:树状展开。可能需要安装

du -h dir :查看各子目录+主目录

du -sh dir :只查看主目录

​ -s 指定目录

​ -h 带单位

​ -a 含文件

​ -c 汇总

​ --max-depth=1 子目录深度

统计目录下文件数:ll dir | grep "^-" | wc -l ^-筛选出文件

防火墙

systemctl status firewalld[.service] 查看防火墙状态

systemctl disable firwalld

常用软件安装包

rpm包

一种互联网下载包的打包和安装工具,生成具有.rpm的文件,Linux的分发版通用

rpm -qaifl |grep xxx:查询是否安装相关软件

​ -a ——all;-q 直接查询;-i 查询版本等信息;-l ——查询软件中的文件;-f ——查询文件路径

noarch通用

rpm -e xxx:卸载软件

卸载是可能遭遇删除对象被其他包依赖,删不掉

如果一定要删除,可以:rpm -e --nodeps xxx

rpm -ivh xxx:安装

​ -i install -v verbose 提示 -h hash 进度条

yum包(很好)

yum服务器

shell前端软件包管理器。基于rpm包管理。可以从指定的服务器自动下载rpm包并安装,可以自动处理依赖关系并一次性安装所有相关依赖包

可以换成国内源

yum [options] command [软件包]

-y 自动回答yes,编码后续每一步询问;-q 不显示安装过程;-c 完全从缓存中运行,不下载或更新头文件

install , update , remove , list(显示可用), search(搜索包), info(显示软件包信息)

yum缓存:默认yum安装软件后会删除下载的软件包。如果想保留,可以编辑/etc/yum.conf,keepcache=1。这样软件包会缓存在/var/cache/yum/目录下,下次安装相同软件包时,可以从缓存中获取软件包,没有网络也能安装

yum clean packages|headers|oldheaders|all 清除缓存

yum makecache 重新建立缓存

shell脚本相关命令

cut:选取

-b 按照字节选取,忽略多字节字符边界,类似-c

-c 选取每行第c个字符

-d 自定义分隔符,默认制表符

-f 选取第f列,与-d共用可以指定区域

sort:排序且去重(基于行)

-n 按照数值大小排序

-r 逆序

-t 设置排序时的分隔符

-k 按指定列排序,一般和-t共用

-u 配合-c,严格校验排序;不配合-c,只输出一次排序结果(去重)

[root@linux02 shell]# cat aaa.txt| cut -d ":" -f 1-3
bb:40:5.4
bd:20:4.2
xz:50:2.3
cls:101:3.5
ss:30:1.6
[root@linux02 shell]# sort -t ":" -k 3 aaa.txt
ss:30:1.6
xz:50:2.3
cls:101:3.5
bd:20:4.2
bb:40:5.4

wc:统计

-c/--bytes/--chars 只统计bytes

-l/--lines 只统计行数

-w/-words 只统计单词数

--version 显示版本信息

默认都显示:行数 单词数 字节数,可以统计多个

[root@linux02 shell]# cat aaa.txt
111
222 bbb
333 aaa bbb
444 aaa bbb ccc
555 aaa bbb ccc ddd
666 aaa bbb ccc ddd eee
[root@linux02 shell]# wc aaa.txt
6 21 84 aaa.txt

uniq:去重,与sort共用

-c 统计行数。不与sort共用,无效

[root@linux02 shell]# cat aaa.txt | uniq -c
1 张三 98
1 李四 100
1 王五 90
1 赵六 95
1 麻七 70
1 李四 100
1 王五 90
1 赵六 95
1 麻七 70
[root@linux02 shell]# cat aaa.txt | uniq
张三 98
李四 100
王五 90
赵六 95
麻七 70
李四 100
王五 90
赵六 95
麻七 70
[root@linux02 shell]# cat aaa.txt | sort | uniq -c
2 李四 100
2 麻七 70
2 王五 90
1 张三 98
2 赵六 95

tee:重定向(>)并输出

-a 追加(>>)

可以直接创建新文件

开启输入,Ctrl+Z结束写入

[root@linux02 shell]# touch bbb.txt
[root@linux02 shell]# cat bbb.txt

(null)

echo "hello" | tee [-a] file

tr:替换或删除

-d/--delete 删除指定部分

-s 进入转义模式

可以利用正则表达式,两种操作不能同时进行

[root@linux02 shell]# echo "abcd" | tr 'a' 'A'
Abcd
[root@linux02 shell]# echo "abcd" | tr -d 'b'
acd

[root@linux02 shell]# echo "sdc3434ewe22sd" | tr "[a-z]" "[A-Z]"
SDC3434EWE22SD
[root@linux02 shell]# echo "sdc3434ewe22sd" | tr -d "[0-9]"
sdcewesd

[root@linux02 shell]# echo "sdc3434ewe22sd" | tr "[a-z]" "[A-Z]" | tr -d "[0-9]"
SDCEWESD

split:分割成小文件

-b 按指定字节分割

-l 按指定行数分割

-d 子文件前缀名

-a 后缀长度

split [-l/-b] xxx [-d prefix -a suffixLength]

awk:分区+匹配

行级分析工具,逐行处理每行数据

pattern 匹配模式

action 匹配成立时执行的命令

-F 指定文件分隔符。默认将文本每行按空格或Tab分割

-f 指定脚本

-v 赋值一个用户定义变量

[root@linux02 shell]# cat aaa.txt
aaa 111 333
bbb 444 555
ccc 666 777 888
ddd 999 222 999

[root@linux02 shell]# awk '{print $1}' aaa.txt
aaa //单引号外围
bbb
ccc
ddd //打印第一列

[root@linux02 shell]# awk '{print $1"#"$2"#"$3}' aaa.txt
aaa#111#333
bbb#444#555
ccc#666#777
ddd#999#222 //每列以#连接

列之间的连接符OFS

[root@linux02 shell]# awk '{OFS="#"}{print $1"#"$2"#"$3}' aaa.txt
aaa#111#333
bbb#444#555
ccc#666#777
ddd#999#222

[root@linux02 shell]# cat bbb.txt
aaa:111:333
bbb:444:555
ccc:666:777:888
ddd:999:222:999:cccc

[root@linux02 shell]# awk -F ":" '{print $1,$2}' bbb.txt
aaa 111
bbb 444
ccc 666
ddd 999 //指定分隔符

内容匹配

$n ~ /pattern/ :匹配模式

[root@linux02 shell]# awk '/cc/' bbb.txt
ccc:666:777:888
ddd:999:222:999:cccc //匹配包含cc的行
[root@linux02 shell]# awk -F ":" '$1 ~ /cc/' bbb.txt
ccc:666:777:888 //匹配第一列包含cc的行

[root@linux02 shell]# awk -F ":" '/aaa/{print $1,$3} /ccc/{print $2}' bbb.txt
aaa 333
666
999 //匹配包含aaa的行输出低1,3列,匹配包含ccc的行输出第2列

内容比较

$n >XXX {action} && ,||, !

$n<$m {action}

[root@linux02 shell]# awk -F ":" '$1"aaa"{print $0}' bbb.txt
aaa:111:333 //匹配第1列aaa,就打印出整行

第几行NR第几列NF

[root@linux02 shell]# awk -F ":" '{print $0" lines"NR" columns"NF}' bbb.txt
aaa:111:333 lines1 columns3
bbb:444:555 lines2 columns3
ccc:666:777:888 lines3 columns4
ddd:999:222:999:cccc lines4 columns5 //输出行号和列数

BEGIN && END

BEGIN{预热行为}{每行任务}END{结尾动作}

大写

[root@linux02 shell]# awk -F ":" 'BEGIN{}{total=total+$2}END{print total}' bbb.txt
2220 //计算每行第2 列和

[root@linux02 shell]# ll | awk 'BEGiN{}{total=total+$5}END{print total}'
247 //计算本目录下所有文件大小

[root@linux02 shell]# awk 'BEGIN{for(i=1;i<10;i++){for(j=1;j<10;j++){printf("%d x %d = %d%s",i,j,i*j,"\t")}print "\n"}}'
1 x 1 = 1 1 x 2 = 2 1 x 3 = 3 1 x 4 = 4 1 x 5 = 5 1 x 6 = 6 1 x 7 = 7 1 x 8 = 8 1 x 9 = 9

2 x 1 = 2 2 x 2 = 4 2 x 3 = 6 2 x 4 = 8 2 x 5 = 10 2 x 6 = 12 2 x 7 = 14 2 x 8 = 16 2 x 9 = 18

3 x 1 = 3 3 x 2 = 6 3 x 3 = 9 3 x 4 = 12 3 x 5 = 15 3 x 6 = 18 3 x 7 = 21 3 x 8 = 24 3 x 9 = 27

4 x 1 = 4 4 x 2 = 8 4 x 3 = 12 4 x 4 = 16 4 x 5 = 20 4 x 6 = 24 4 x 7 = 28 4 x 8 = 32 4 x 9 = 36

5 x 1 = 5 5 x 2 = 10 5 x 3 = 15 5 x 4 = 20 5 x 5 = 25 5 x 6 = 30 5 x 7 = 35 5 x 8 = 40 5 x 9 = 45

6 x 1 = 6 6 x 2 = 12 6 x 3 = 18 6 x 4 = 24 6 x 5 = 30 6 x 6 = 36 6 x 7 = 42 6 x 8 = 48 6 x 9 = 54

7 x 1 = 7 7 x 2 = 14 7 x 3 = 21 7 x 4 = 28 7 x 5 = 35 7 x 6 = 42 7 x 7 = 49 7 x 8 = 56 7 x 9 = 63

8 x 1 = 8 8 x 2 = 16 8 x 3 = 24 8 x 4 = 32 8 x 5 = 40 8 x 6 = 48 8 x 7 = 56 8 x 8 = 64 8 x 9 = 72

9 x 1 = 9 9 x 2 = 18 9 x 3 = 27 9 x 4 = 36 9 x 5 = 45 9 x 6 = 54 9 x 7 = 63 9 x 8 = 72 9 x 9 = 81

sed:过滤+增删改查

-n 仅显示处理结果

-e 以指定脚本(代码)处理输入的文本

-f 以指定的脚本(文件)处理输入文本

-r 允许使用正则

-i 使操作实际影响源文件

动作:

p 打印;d 删除;a 追加(后);i 插入(前);

c 取代(行级);s 取代(单词级,配合正则,不用-r);

= 显示行号

每个模式前后面各只能跟一个动作

p,= 位于后面,

增删改位于前面

[root@linux02 shell]# cat aaa.txt
a java root
bbb hello
ccc rt
ddd root nologin
eee rtt
fff ROOT nologin
ggg rttt

单引号围绕,动作在匹配模式后

[root@linux02 shell]# sed -n -e '/root/p' aaa.txt
a java root
ddd root nologin //查看包含root的行

[root@linux02 shell]# sed -nr -e '/r+t/=' aaa.txt
3
5
7 //查看匹配正则的行号

操作行

line action

1,$ action

//增删改动作放在前面

[root@linux02 shell]# sed -n '2p' aaa.txt
bbb hello //查看第2行

[root@linux02 shell]# sed -n '2,5p' aaa.txt
bbb hello
ccc rt
ddd root nologin
eee rtt //查看2-5行
[root@linux02 shell]# sed -n -e '1,$p' -e '1,$=' aaa.txt
a java root
1
bbb hello
2
ccc rt
3
ddd root nologin
4
eee rtt
5
fff ROOT nologin
6
ggg rttt
7 //查看所有行及各自行号

增加

这个增加是临时的。不会记录到文件中,只是在显示时展示

[root@linux02 shell]# cat aaa.txt |sed -e '2a 11' -e '1i AAA'
AAA
a java root
bbb hello
11
ccc rt
ddd root nologin
eee rtt
fff ROOT nologin
ggg rttt //与下面对比,可以看到是临时的
[root@linux02 shell]# cat aaa.txt
a java root
bbb hello
ccc rt
ddd root nologin
eee rtt
fff ROOT nologin
ggg rttt

删除

-e '2,3d' //删除2,3行

替换(更改)

-e '3c XXX' 指定单行/多行换成指定数据

-e 's/aa/bb' //指定aa换成bb

对文件影响

sed -i -e 'XXX'

最后附上一张命令对照表:https://www.shouce.ren/api/linux/