目录
操作系统下载:https://www.centos.org/download/
网络配置
桥接模式下,通过虚拟网桥连接一个交换机,各虚拟机连接到交换机上,那么各虚拟机与主机共享主机所在的网络,虚拟机的网络地址与主机的在同一个网段里。
nat模式下,创建一个虚拟路由器,各虚拟机连接到虚拟路由器上,虚拟机有自己的网段。vnet8是为了主机能够访问虚拟机里面的主机,这个虚拟网卡连接到虚拟路由器上,网关是虚拟路由器的地址,vnet8虚拟网卡也有一个地址,网关会将虚拟机的地址转换为网卡的地址进行外部连接。虚拟机访问外部地址是通过主机的网卡访问的。
仅主机模式下,是将nat模式中的路由器换成了交换机,虚拟机仅能连接到主机,主机仍然可通过vnet8访问虚拟机。
- 网络配置位置:
/etc/sysconfig/network-scripts/ifcfg-ens33
- 主机名配置位置:
/etc/hostname
,命令hostname
,hostnamectl
,hostnamectl set-hostname xxx
- hosts配置文件:
/etc/hosts
系统管理
进程,是一个正在执行的程序或命令,其中后一直常驻内存的一般被称作服务,linux中服务一般会以d结尾,表示是一个daemon进程
- 守护进程位置:
/etc/init.d/
、/usr/lib/systemd/
,后者是centos7才有的,centos7里面使用systemctl start/stop/restart/status serviceName
,centos6使用service serviceName start/stop/restart/status
。centos7里面NetworkManager服务替代了原来的network服务 - centos6配置运行级别位置在
/etc/inittab
,改变当前运行级别:init 3
,init 5
,systemctl get-default
查看当前运行级别,systemctl set-default
设置运行级别 - setup进入图形化界面配置服务是否开机启动,
chkconfig serviceName on/off
打开关闭开机启动,chkconfig --level 3 serviceName on/off
打开关闭某个级别是否开机启动,cetos7配置开机启动可以使用systemctl enable/disable serviceName
。防火墙配置,centos6下是iptables,使用service status/start/stop iptables
查看,centos7下使用systemctl status/stop/start/restart/enable/disable firewalld
- 关机重启
shutdown
,默认1分钟后关机,shutdown -c
取消shutdown命令,shutdown 5
5分钟后关机shutdown now
立刻关机,shutdown 10:00
指定时间关机sync
将数据由内存同步到硬盘,shutdown now
执行后也会先执行halt
停机,不断电poweroff
关机reboot
,重启,相当于shutdown -r now
shutdown [选项] 时间
常用命令
sh是指向bash的连接,bash是bourne again shell的缩写
帮助命令
ls是外置命令,cd是内置命令,内置到shell里面的
- 使用
type 命令
查看是否是内置命令 - 内置命令使用
help 命令
查看使用帮助 - 外部命令使用
命令 --help
查看
还使用man 命令
查看帮助文档,这个可以直接查看外部命令的,如果查看内置命令可以使用man -f 命令
查看该命令的第几册才有,然后使用man 册名(或可以区分的首字符) 命令
查看,册名中1p表示posix协议(可移植性协议)
man查看命令是比较全面的,一般使使用命令 --help
查看,内部命令使用help 命令
查看即可
Ctrl + c
停止进程Ctrl + l
清屏,或者clear,使用reset彻底删除bash的所有记录table
补全命令
文件目录命令
cd是内置命令,pwd也是内置命令
cd
,会回到当前用户的home目录,cd -
,进入上一次的工作目录ls -a
,显示当前目录下的所有内容,包括以.
开头的隐藏文件和目录。ls -l
,一行列出一个文件,ls -lh
友好显示文件大小mkdir
,mkdir -p
,rmdir
touch
,创建一个空文件,或者使用vim然后保存也可以cp
,\cp
使用cp的原生命令,如果用重名文件是不会提示的,默认的cp是cp -i
别名,cp -r
递归复制alias
可以查看系统的别名mv
移动文件或目录,或重命名,移动文件,目标目录必须存在,如果文件名称与原来不相同,表示移动后重命名。移动目录,如果目标目录存在,则直接移动,名称不变,如果目标目录不存在但父目录存在,表示重命名,父目录不存在则与移动文件时目录不存在一样不允许移动。cat
,将标准输入的内容输出到标准输出,-n
显示行号more
,分页查看文件内容,查看到最后自动退出,不好用less
,分页查看文件内容,比more更加强大,根据要显示的内容加载,对于显示大型文件具有较高的效率。- 翻页
f/b
,滚动e/y
,(vim中要加Ctrl) - 也可以使用
空格
向下翻页,enter
向下滚动,gg/Shift + g
也可以使用 - 按
=
显示当前显示内容的信息,q
退出 Shift + f
接收显示最新的数据,与tail -f
类似
- 翻页
echo -e
,支持反斜线转义的字符- 重定向
>
,>>
ln -s sourceFile newFile
,创建软连接,ln sourceFile newFile
创建硬链接,不能为目录创建硬链接,硬链接表示多个文件指向了同一个inode节点,删除一个别的还可以访问这个inode。软连接是指向了某个文件,这个文件指向了它的inode,如果source文件没了,那么软连接也无法访问到这个inode了
时间日期
date +'%Y-%m-%d %H:%M:%S, timestamps=%s'
date -d '1 hours ago' +'%Y-%m-%d %H:%M:%S, timestamps=%s'
date -s "2022-09-25 10:10:10"
设置时间cal
,日历命令
用户管理
useradd 用户名
,-d指定home目录useradd -g 组名 用户名
passwd 用户名
,修改用户的密码id 用户名
,查看用户信息,所有用户信息在/etc/passwd
,su 用户
切换用户,exit
退出当前用户whoami
,查看当前用户,who am i
查看当前会话是由哪个用户创建,使用su切换前的那个用户,who
查看登录的所有用户/etc/suders
,可以配置哪些用户可以使用sudo
临时获取root的权限(需要输入当前用户的密码),sudoers相当于root授权了哪些用户可以临时使用root的权限userdel 用户名
删除用户,userdel -r 用户名
同时删除用户的home目录
用户组管理
/etc/group
,查看所有的用户组信息,在wheel组的用户,在sudoers里面该组配置了具有管理员权限groupadd 组名
,添加组usermod -g 组名 用户名
,修改用户的组名groupmod -n 新组名 旧组名
,修改组名groupdel 组名
,删除组名
文件权限
- 文件属性
- 第0位表示类型,-表示文件,d表示目录,l表示连接,c表示字符设备,b表示块设备
- 第1到第9位分别表示,文件所有者的权限,所在组的权限,其他用户的权限,如果要删除文件,需要该文件所在目录的w权限,目录中r表示可以查看,x表示可以进入到该目录
- 权限后面的数字表示当前文件硬链接的数量,如果是目录,表示当前目录下的子目录的数量
chmod [ugoa][+-=][rwx] 文件/目录
,ugoa分别表示所有者、所有者的组、其他用户、所有用户,+-=表示增加、减少、赋予相应权限,或者使用cmod [三个1-7的数字]
,-R
可以递归目录下的所有文件和目录的权限chown [选项] 用户 文件/目录
,更改文件或目录的所有者chgrp
,更改文件或目录的组,一个文件属于的组不一定是所属用户的组
搜索查找
find [路径,默认当前目录] -name '匹配模式'
,从指定目录向下递归遍历,将满足条件的文件显示在终端find [path] -user 用户名
,查找指定用户名的文件find [path] -size +10M
,查找大于10M的文件,ls -lh
可以更清楚的显示文件大小locate 名称
,利用事先建立的系统中所有文件名称及路径的locate数据库实现快速定位给定的文件。locate无须遍历整个文件系统,查询速度较快,为了保证查询结果的准确度,管理员必须定时更新locate时刻updatedb
,更新locate数据库,在locate之前使用,查找更精确,默认每天更新which 命令
,查看命令在哪里定义的whereis 命令
,查看命令所在目录grep [选项] 名称 文件
,从文件中匹配名称,-n输出所在行号,一般与管道符|
结合使用wc 文件名
,输入文件里面的行数、单词数、字节数,wc -l 文件
输出行数
压缩解压
gzip 文件名
,将文件压缩成.gz文件,只能压缩文件,压缩后会删除源文件gunzip gz文件
,将.gz文件解压缩zip -r xxx.zip 目录
,将目录压缩为一个zip包,源目录保留unzip xxx.zip -d newDir
,将zip解压到newDirtar -cvzf xxx.tar.gz 目录
,将目录打包并压缩,可以跟多个文件或目录,c表示创建,z表示使用gzip压缩,f表示指定压缩文件名称,v表示详细展示归档文件tar -xvzf xxx.tar.gz -C newDir
,将tar.gz解压到newDir目录内
磁盘查看和分区
du -sh *
,查看当前目录下所有目录各占磁盘大小,disk usage,不能查看不同分区的大小df -h
,查看磁盘使用量,查看文件系统的磁盘空间占用情况tmpfs
,临时文件系统,基于内存的文件系统,/dev/shm
表示所有进程都可以共享的内存,默认系统内存的一般
free -h
,查看内存及交换分区内存大小lsblk
,查看块设备,磁盘分区情况,lsblk -f
输出文件系统信息mount 设备名 挂载点
,将设备挂载到指定目录umount 设备名或者挂载点
,将设备卸载/etc/fstab
,设置开机自动挂载,第一列写uuid或者设备名也可以,最后的两个0分别表示故障时是否dump、开机检查fsck的优先级(0表示不检查)fdisk -l
,查看磁盘分区详情fdisk 设备名
,对磁盘进行分区,linux最多有4个主分区,如果超过4个可以设置扩展分区,扩展分区可以从5到16,创建分区后需要格式化才能使用,挂载后原来挂载点的数据就无法查看了mkfs -t xfs 设备名
,-t指定文件系统类型
进程管理
1号进程就是/usr/lib/systemd/systemd
,centos7的初始进程
查看cpu占用和内存占用使用ps aux
查看父进程id使用ps -ef
ps aux
,process status,没有参数会输出当前终端运行的进程,a当前用户的终端进程,x所有用户的进程,u用户友好的显示风格,BSD风格,使用less分页查看ps aux | less
- USER,哪个用户
- PID,进程id
- %CPU,占用cpu大小
- %MEM,占用内存大小
- VSZ,占用的虚拟内存大小,kB,有一定的算法,内存中有些页面不常用就会放到虚拟内存中
- RSS,占用的实际物理内存, resident set size, the non-swapped physical memory that a task has used (in kiloBytes). (alias rssize, rsz)
- TTY,表示使用的是哪个终端,?表示没有使用终端,tty1表示图形化终端,tt2-tty6是本地的字符界面终端,pts0-255表示虚拟终端
- STAT,进程状态,R运行状态,S睡眠状态,T暂停状态,Z僵尸状态(可能父进程需要它的某些信息,当父进程退出的时候它就会退出了),s包含子进程,l多线程,+前台显示,<表示高优先级,N表示低优先级
- START,进程启动时间
- TIME,占用cpu的时间
- CMD,启动该进程时的命令,对于sshd服务,如果用其他用户登录,会有两个进程,一个是xxx@pts/x,一个带
[priv]
是root用户的,当该用户运行root权限的命令时会使用该进程,其他命令则使用另外一个用户进程
ps -ef
,unix风格,会列出父进程PPID- 0号父进程是内核进程
- 1号进程是
/usr/lib/systemd/systemd
,它的父进程是0号进程 - 2号进程
kthreadd
的父进程也是0号进程,是做线程调度的 - 当前终端输入的命令的父进程是一个
-bash
,它的父进程则是pts/x终端的PID,pts/x终端的父进程是sshd服务的,sshd服务的父进程是1,是系统
kill 选项 进程号
,通过进程号杀死进程,PID,processID- 如果杀死父进程,子进程会还存在,PPID会赋值为1
- 如果进程在活跃状态,kill杀不掉可以使用
kill -9
killall 进程名称
,通过进程名称杀死进程,支持通配符,这在系统因负载过大而变得很慢时很有用pstree
,查看进程树,进程之间的父子关系,pstree -p
显示PIDtop
,实时监控系统进程状态- 第一行top:系统当前时间,系统持续运行时间,当前有几个用户登录到系统(图形化界面也是),load average表示过去的1分钟、5分钟、15分钟整个系统的平均负载(一般认为小于0.7是比较小的)
- 第二行Tasks:total表示系统中总进程数,running的数量,sleep的数量,stop的数量,僵尸进程数量
- 第三行:cpu占用情况,
- us表示用户进程占cpu的时间百分比(没有更改优先级的用户进程)
- sy表示系统进程占用cpu的时间百分比(kernal进程)
- ni表示通过nice调整进程优先级之后的进程占cpu的时间百分比
- id表示空闲时间百分比
- wa表示等待进程占用的时间百分比,等待IO操作
- hi表示硬件中断请求占用的时间百分比
- si表示软中断请求占用的时间百分比
- st表示被偷的(虚拟化的)cpu占用时间百分比
- 第四行KiB Mem:内存占用情况
- total表示总共有多少,free表示有多少是空闲状态,used表示使用了多少,buff/cache表示有多少是放在缓存里面的
- 第五行KiB Swap:交换内存(虚拟内存)占用情况
- 下面显示的标题中分别表示:按f可以查看说明
- PID(进程号)
- USER(用户)
- PR(任务优先级priority)
- NI(用户指定的nice值,nice越大越容易被抢占)
- VIRT(virtual image虚拟内存占用大小)
- RES(resident,实际物理内存占用大小)
- SHR(shared,当前进程共享的内存大小
- 进程允许别的进程也用它的这个共享内存)
- S(status,进程状态,ps命令里面有写)
- %CPU(使用cpu占比)
- %MEM(使用内存占比)
- TIME+(已经占用的CPU总时间是多少,+表示精度)
- COMMAND(生成当前进程的命令)
- 使用
- 当前默认是按照cpu的占比排序的,按照内存占比排序使用
Shift + m
,按照cpu占比排序Shift + p
,安装PID从大到小Shift + n
- 按上下键、翻页键可以进行滚动查看,退出按q
top -d 5
,每5秒刷新一次top -i
,不显示空闲(idle,Sleep的,并不是所有的S都不显示,只是上次统计之后到当前为止没有占用的不显示,有可能占用了一下又不占用了)或僵尸进程top -p PID
,只查看某个进程的状态- top进去之后,如果想查看某个用户的,可以按u,输入用户名
- 如果想kill某个进程,按k,输入PID,top有ps和kill的功能
- 当前默认是按照cpu的占比排序的,按照内存占比排序使用
netstat
,显示网络状态和端口占用信息,netstat -anp
查看进程的网络信息,netstat -lnp
查看端口号占用情况,一般使用前者就可以了,前者的信息包含后者,不在监听的也列了处理- a,表示显示所有监听和未监听的套接字,all
- l,表示只列出监听状态的进程,listen
- n,表示不显示别名,域名显示为ip地址,no
- p,表示显示哪个进程在调用
- 标题含义:
- Proto,协议
- Recv-Q,当前套接字已经接收到数据,但是还没有拷贝出的字节数
- Send-Q,已经将套接字发出,但是还没有接收到确认的字节数
- Local Address,本地地址,0.0.0.0表示监听本地所有ip地址的这个端口,127.0.0.1表示本地回环地址(主要用于测试)
- Foreign Address,远程地址
- State,LISTEN表示正在监听,ESTABLISHED表示已经建立连接了
- PID/Program name,进程id及对应的程序名称
cron系统定时任务
后台守护进程是crond,systemctl status crond
crontab -e
,添加定时任务crontab -l
,列出定时任务crontab -r
,删除当前用户所有定时任务- 定时表达式:
* * * * *
,表示分钟(0-59),小时(0-23),天(1-31),月(1-12),周几(0-7)*
,表示任何时间,
,表示不连续的时间-
,表示连续的时间*/n
,表示隔多久执行一次
软件包管理
rpm -qa
,查询所有rpm包rpm -ql 包名
,查询安装位置rpm -qi 包名
,查询包信息rpm -e 包名
,删除rpm依赖,--nodeps,不检查依赖关系,如果检查的话当前包被别的软件依赖是不能卸载的rpm -ivh 包全名
,安装rpm,必须有rpm安装文件,--nodeps,不检查依赖关系,可能有依赖其他安装包- yum,能够从指定服务器自动下载rpm包,并且安装,自动处理依赖关系,是基于rpm的
yum -y install 包名
,安装yum remove 包名列表
,删除安装包,与使用rpm删除一样yum update
,更新yum check-update
,检查是否有更新yum list
,列出所有软件包信息yum clean 参数
,清除yum过期的缓存,后面需要跟参数yum deplist 包名列表
,显示yum安装包的所有依赖关系
- yum会自动查找最近的源进行下载,也可以使用wget下载一个国内的repo,替换
/etc/yum.repos.d/Centos-Base.repo
,替换前备份一下
Shell编程
shell是一个命令行解释器,接收应用程序/用户的命令,然后调用操作系统内核。还是一个功能相当强大的编程语言,易编写,易调试,灵活性强。
查看操作系统支持的shell,cat /etc/shells
,查看当前shell,echo $SHELL
Shell脚本入门
第一行一般使用#!/bin/bash
指定解析器
执行脚本
- 使用
sh、bash
命令执行,不需要脚本有可执行权限,脚本是作为命令的一个参数 - 执行脚本本身,需要有可执行权限,使用绝对目录,或者使用相对目录,注意在当前目录下需要使用./,否则会解析脚本为一个命令(或者将脚本所在路径放在PATH里)
- 使用
source或.
命令执行,表示使用当前shell执行,上面的两种执行方式会使用创建子shell执行脚本,不会影响当前shell的环境变量
变量
系统变量与用户变量:系统预定义的,和用户自己定义的
全局变量与局部变量:全局变量在shell及子shell都有效,局部变量表示只在当前shell有效
在当前shell执行bash,会进入子shell,使用ps -f
可以查看当前shell的进程,会发现bash
的父进程是-bash
,exit退出当前shell
系统变量:
- 常见系统变量:
$HOME、$PWD、$SHELL、$USER、$PATH
- 查看所有系统环境变量使用命令
env
或者printenv
,printenv 变量名
可以打印出变量值,如printenv HOME
,也可以等价的使用echo $HOME
- 查看包括系统环境变量及自定义的环境变量使用命令
set
自定义变量:
- 用户自定义变量:
变量名=值
,变量名使用字母、数字、下划线,不能数字开头,默认字符串类型,不能有空格,如果有空格需要使用引号括起来 - 提升为全局变量使用
export 变量名
,此时子shell可以访问到,但是子shell对该变量的修改不会影响到父shell - 定义只读变量
readonly xx=xx
- 取消变量使用
unset 变量名
,只读变量不能使用unset,它是一个常量
注意:平常使用sh或./xx执行脚本是不会获取到当前shell定义的局部变量的,因为该执行方式会创建子shell执行,如果需要脚本访问,需要使用export提升为全局变量
特殊变量:
$n
,n为数字,大于10使用花括号括起来,$0表示脚本名称,$1表示第一个参数,以此类推,双引号中的$xxx是占位符,会进行解析该命令,单引号中的就是字符串本身,不会解析$#
,获取脚本参数个数$*、$@
,获取所有脚本参数,前者将参数看成一个空格分割的整体字符串,后者将参数分割为数组$?
,最后一个命令的返回状态,正确执行返回0
运算符
expr 1 + 2
,执行表达式,作为三个参数传递给命令expr,注意乘使用*,使用比较麻烦- 使用
$((表达式))
或$[表达式]
计算,或者使用let a+=1
、let a++
- 替换命令执行的结果使用
$(命令)
或者使用两个反引号
条件判断
test $a = Hello
,echo $?
,注意等号两边有空格,如果返回0表示true,返回1表示false,比较麻烦- 使用
[ 条件表达式 ]
,注意表达式两边有空格,注意如果是字符串非空即为true - 整数比较使用:
-eq
等于,-ne
不等于,-lt
小于,-gt
大于,-le
小于等于,-ge
大于等于 - 字符比较使用:
=
,!=
- 文件权限判断:
-r、-w、-x
分别表示有读、写、可执行权限 - 文件类型判断:
-e
文件存在,-f
是一个文件,-d
是一个目录 &&、||
:逻辑与、逻辑或,&&表示前一条执行成功才执行后一条命令,||表示前一条执行失败才执行后一条命令,同时使用可以达到三元运算符的效果,a && b || c,如果a真执行b,如果a假执行c-z xxx
,xxx为空判断- 如果是多个表达式,在同一个
[]
也可以使用-a表示逻辑与,-o表示逻辑或,如[ a = a -a b = b ]
等价于[ a = a ] && [ b = b]
流程控制
if判断
# else和elif都是可选的,也可以不使用[] 使用test一样的,也可以使用((条件表达式))
if [ 条件表达式 ];then # 使用分号是因为有两个命令写在了同一行,也可以不使用分号,将then换行
程序
elif [ 条件表达式 ]
then
程序
else
程序
fi
case语句
# case行尾必须为in,每一个模式匹配以右括号结束
# ;;相当于break
case $xxx in
值1)
程序1
;;
值2)
程序2
;;
*)
上述条件都不满足情况下执行
;;
esac
for循环
# 在双小括号内可以使用各种数学运算符,if后面也可以使用双小括号,双小括号也可以做逻辑运算,如果是逻辑true计算结果为1,
for((初始值;循环控制条件;条件变化)) # for后没有空格也可以,小括号内没有空格也可以,可以使用<=,i++
do
程序
done
# 遍历序列
for 变量 in 值1 值2 值3 # in后面可以跟{1..100}表示1到100的序列,这个100不能使用变量代替,否则就全部变成了一个字符串
do
程序
done
# for para in $*或者$@是没有区别的,因为前者还是空格分割的字符串,这里会被for遍历到
# 如果使用for para in "$*"或"$@",那么就有区别了,前者就变成了一个字符串,后者还是被双引号解释后是一个数组
while循环
while [ 条件表达式 ]
do
程序
done
读取控制台的输入
read -t 超时时间 -p 提示符 变量名
# 超时时间单位为秒
# 如下所示,将输入的内容赋值给name变量
read -t 10 -p 'please input:' name
系统函数
basename xxx
,将xxx最后一个/及之前的内容剪切掉,一般用于获取文件名称- 如果指定后者会将后缀剪切掉,如
basename xxx.sh .sh
会得到xxx,basename xxx x
会得到xx
- 如果指定后者会将后缀剪切掉,如
dirname xxx
,将最后一个/及之后的内容剪切掉,一般用于获取文件的父目录- 获取脚本所在的绝对目录可以使用
$(cd ${dirname $0}; pwd)
- 获取脚本所在的绝对目录可以使用
自定义函数
functionName # 如果没有小括号,参数可以使用$1/$2等获取,与脚本参数相同,function关键字可以不写
{
程序
}
# 或者
function fName()
{
程序
return 1; # 返回值可以是0-255,返回值只能通过$?获取,如果不加return将以最后一条命令的运行结果作为返回值,如果想要返回其他数据或者不在0-255的数据可以使用echo返回值,然后return,在调用函数时使用$(函数调用)来获取到echo的数据
}
正则表达式
^abc
,表示以abc开头的行abc$
,表示以abc结尾的行,^$
表示匹配空行r..t
,.表示任意字符,r..t
表示匹配任意rxxt的字符*
,不单独使用,与上一个字符连用,表示匹配0次或多次,.*
表示任意字符出现任意多次[]
,表示匹配某个范围内的一个字符[1,2]
,表示匹配1或2[0-9]
,表示匹配0-9的数字,[0-9]*
表示匹配任意长度的数字字符串,这里表示前面的中括号内的字符都可以任意多次[a-z]
,表示匹配a-z之间的字符,[a-z]*
表示匹配任意长度的字母字符串,注意需要使用单引号''扩起来避免单独使用时有问题,比如echo hello | grep '[a-z]*'
,不要使用双引号,因为双引号会先解释
\
,特殊字符的话使用转义字符,并使用单引号括起来- 还有其他扩展的正则表达式
grep -n xxx
,可以显示行号grep -E 正则表达式
,这里可以使用扩展的正则表达式,比如{2}前面的字符只出现两次
文本处理工具
cut -d 分隔符 -f 取哪些列
,剪切某一列数据,分隔符只能是单个字符(相当于每一个分隔符都会画一条竖线,每一行画一条横线,组成一张表,取第n列)cut -d " " -f 1
,取第一列,2-
,取第二列及后面的所有列,-3
,取第一列至第三列- 可以结合grep获取想要截取的内容,使用管道符,否则在后面跟文件名
awk -F "分隔符" '/pattern/{action}' 文件
,将文件的每一行以指定分隔符切分,使用pattern进行匹配,留下含匹配内容的行,匹配后的内容执行action代码,(awk切分不会包含空的列,cut包含虚拟的列)- 分隔符参数-F可选,默认是空格分割,/pattern/也是可选,
$1
表示第一列,$n
表示每一行的所有内容 cat a.txt | awk -F " " '/a/{print $1"---"}'
,匹配含有a的行,并打印第一列加---后缀cat a.txt | awk -F " " '{print $1"---"}'
,也可以不使用正则匹配,所有行执行action命令cat a.txt | awk -F " " '/a/BEGIN{print hi}{print $1"---"}END{print "endend"}'
,在执行action命令前后分别执行一些命令cat /etc/passwd | awk -v i=2 -F ":" '{print $3+i}'
,使用-v指定变量- 内置变量:
FILENAME
文件名,NR
行号,NF
当前行分割了多少列
- 分隔符参数-F可选,默认是空格分割,/pattern/也是可选,