Linux Shell
入门篇(1-2)
操作系统就是直接用来操作计算机底层硬件的软件。企鹅:喝多了的企鹅,爽翻了,自由散漫。TUX, Linus Torvalds Linux之父。
1991年6月确定开发,9月开发完成0.01版本,公开了源代码,命名Linux.
2005年 BitKeeper打算对Linux的团队收费,Linus决定自己开发,几周时间开发完成Git,2008年,代码管理网站Github上线。
Richard Stallman自由软件运动倡导者,MIT AI实验室职业黑客。 1985年,发出GNU宣言,GNU=GNU IS NOT UNIX.即GNU不像UNIX一样收费,兼容于UNIX的项目。提倡软件商应该通过服务和培训收费,而不是软件专利。软件需要公开透明,让别人知道这个软件的目的和如何实现。
GNU遵循GPL协议规范,用是开源的,更改后的代码发布也是开源的。而BSD不同之处在于使用是免费的,更改后可以拿去商业化。苹果是基于BSD进行的开发。 1991年LInus受到理查德斯托曼的影响将Linux开源。
centOS和UBUNTU是使用最多的。UBUNTU个人使用最多。
基础篇(3-6)
1.目录结构
linux系统一切皆文件,硬件设备也是作为文件去管理的。
2.文本编辑器
vim:编辑器之神,只做文本编辑器。vim是功能更强大的vi. vi没有颜色。把控制台当成文本编辑器
emacs:神之编辑器,理查德斯托曼写的,文本解释器,lisp语言写的。all in one?
$ vim xxx.txt
vim命令:
-
小写字母表示操作将在“向后“执行。下一行,后一个,光标后。
-
大写字母表示操作将在“向前”执行。上一行、前一个、光标前等。
-
一种功能可能通过不同的组合方式都能实现。
-
关于单词个数的计数,空格不算单词,逗号算一个单词。
-
向后包括当前光标
-
向前操作不包括当前光标
-
涉及大小写转换的时候可以不要用大写键 而是用shift+小写 就不用再切换回来
保护/一般模式下的文本操作
d([n])h 删除光标左边不包含光标的n个字符
d([n])l 删除光标右边包含光标的n个字符
([n])dd 删除/剪切整行
d([n])w 删除/剪切后一个单词 如果只剩下一个单词就会删掉当前这个字符
d+shift+4 删除当前到最后
d+shift+6 删除当前到行首
x([n]) 剪切光标后n个字符
X([n]) 向前剪切n个字符
y([n])h 复制光标左边不包含光标的n个字符
y([n])l 复制光标右边包含光标的n个字符
y([n])w 复制后面n个单词(从当前光标开始)
([n])yy 复制整行
y$ 复制当前到最后
y^ 复制当前到行首
([n])p 单个字符光标后粘贴,整行在光标下一行新建N行粘贴
P 光标前粘贴
r filename 在当前位置下一行插入filename的全部内容
[n]r filename 在文件的第n行的下一行处插入filename的全部内容
r 替换单个字符
R 替换多个字符一连串
u 撤销上一步
光标移动
w 跳下一个单词开头;
e 跳下一个单词末尾;
b 跳前一个单词开头
^ 移动到行首
0 移动到行首
$ 移动到行尾
gg 跳到当前文档开头
G 跳到最后
([n])G调到指定行
H 跳到文档开头 head
L 跳到最后
编辑模式:
i 在光标前插入
a 在光标后插入
A 在当前行的最后插入
I 在当前行行首处插入
o 光标所在行下面新建行插入
O 光标所在行上面新建行插入
命令模式:
:w 保存
:q 退出
:q! 不保存退出 强退
:wq 保存并退出
:wq! 强制保存只读文件
/([要查的单词]) 查找单词 全部高亮,可以按n跳转下一个高亮 N上一个
:s/([旧词])/([新词]) 只有当前光标行的第一个匹配项会被替换
:s/([旧词])/([新词])/g 当前行匹配项全部替换 global
:%s/([旧词])/([新词]) 替换所有行的第一个
:%s/([旧词])/([新词])g 替换所有
:noh 取消全部高亮
:set nu 显示行号
:set nonu 不显示行号
3.网络配置
个人机器与远程服务器(实体服务器/ 云分布式集群)进行数据交流。主机与虚拟机上的通讯。
查询自己的IP信息
ipconfig Windows查看
ifconfig linux查看 interface config
网络检测小工具 ping
ping ip/域名 win/linux通用
vmware会创建两个虚拟网络,即虚拟网卡(网络适配器),子网掩码255.255.255.0证明前三个段都一样才能在同一个局域网里互相通信。
vmware的三种网络连接模式:
- 桥接模式: 虚拟机连接到外部物理网,主机起网桥作用,对外部网可见。IP容易不够用。用得少。还可以管理员模式配置vmnet0
- NAT模式:虚拟机与主机组成专用网络,通过虚拟地址转换NAT对IP进行转换,虚拟机共享主机IP访问外部网,外部网不能访问虚拟机。虚拟出一个局域网,虚拟出一个NAT 和DHCP。安全性私密性好。
用于主机访问虚拟机通过虚拟网卡vmnet8. - 仅主机模式:只能与主机共享一个网络,无法与外界通信。安全性最高。虚拟出vmnet1网卡。
DHCP动态IP地址分配存在与路由器中,为不同电脑分配动态地址。
更改静态配置
vim /etc/sysconfig/network-scripts/ens33
更改主机名
查看主机配置
$ hostnamectl
更改主机名
$ hostnamectl set-hostname chunli
在host下添加主机名和IP地址的映射 同时应该更改win32下的hosts
$ vim /etc/hosts
远程登录
$ ssh 服务器名
进程与服务
进程:正在执行的程序或命令
服务:启动后一直存在、常驻内存的进程
守护进程:deamon,结尾带d的表示这是守护进程,.service是一个服务,.target是一个服务包。
查看服务的方法:
$ ls /usr/sbin/ | grep service
$ ls /usr/lib/systemd/
语法:service 服务名 start|stop|restart|status
语法:systemctl start|stop|restart|status
init进程是系统启动后的第一个进程。init会根据用户定义的运行级别调用进程。
运行级别:
开机——>BIOS——>/boot(根据Linux内核内部配置进行初始化)——>init进程(用户级别主动启动的第一个进程)——>运行级别——>运行级别对应的服务
查看运行级别
$ vi /etc/
$ systemctl get-default
运行级别有7级,常用3和5
multi-user.target 级别3 多用户有网 无图形界面
graphical.target 级别5 多用户有网 无图形界面
查看自启动进程
$ chkconfig --list
查看防火墙(ubuntu看不了)
$ systemctl status firewalld
关机
默认一分钟后关机 n分钟后关机
$ shutdown ([n])
定时关机 后面直接加时间点
$ shutdown 18:45
取消关机指令
$ shutdown -c
立即关机
$ shutdown now
关机需要一分钟,因为关机前会先执行sync操作,用这些时间把缓冲区内容写进电脑硬盘。
关机其他操作
sync 同步,将数据由内存同步到硬盘中
halt 停机,不断电,相当于休眠
poweroff 关机断电
reboot 重启
shutdown [选项] [时间]
shutdown -H now 关机
shutdown -r now 重启
实操篇(7)
Shell可以认为是一个命令解释器,提供交互式文本控制台界面,shel进行解释后,交给内核执行。
Unix 使用的shell解释命令(程序)叫Bourne Shell ,加强了对用户命令的解释后,使用Bourne Again Shell简称BASH。
Debian 的发行版Ubuntu使用的叫Dash.
7.1 帮助命令
man获取帮助信息
man(manual 手册)
$ man 命令
$ man -f cd
help获得shell内置命令的信息
一些基础功能是内嵌在shell里的,系统加载启动后会随着shell一起加载,常驻内存,这部分叫内置命令,如cd,exit,其余叫外部命令。
$ help 命令
判断命令的类型
$ type 命令
会显示是否为内嵌命令。
获得命令历史
$ history
获得最近10条指令
$ history 10
清空历史命令
$ history -c
常用快捷键
ctrl+c 停止进程
ctrl+l 清屏
$ clear 清屏
$ reset 彻底清屏
7.2 文件目录类
pwd显示当前目录的绝对路径
print working directory打印工作目录
1.默认显示软链接路径
$ pwd
2.显示直接路径
$ pwd -P
ls列出目录内容
list缩写
… 上一层目录
. 当前目录
… 和.也是这个目录下的内容
.bashrc是用户的配置文件,例如环境变量等。
显示所有内容
$ ls -a
长数据串列出包含文件的的属性与权限等 等价于ll
文件类型与权限 链接数 文件属主 文件属组 文件大小byte 最近修改时间 名字
$ ls -l
$ ll
合并两个命令
$ ls -al
查看文件大小
$ ls -lh
cd切换工作目录
切换到刚才的目录
$ cd -
mkdir创建文件夹
不能嵌套创建
1.创建文件夹
$ mkdir 文件夹名称
2.同时创建多个文件夹
$ mkdir a b c
3.创建嵌套文件夹
$ mkdir -p a/b/c/d
4.删除空文件夹
$ rmdir 文件夹名
5.同时删除多个空文件夹
$ rmdir a b c
6.嵌套删除,如果a下面只有b,b下面只有c,这样会把abc全部删除,如果还有其他文件夹则父文件夹会保留
$ rmdir -p a/b/c
touch创建文件
文件可以指定在绝对路径或相对路径下的文件名
1.touch可以创建空文件
$ touch 文件名
2.vim创建空文件后不保存会没有,不能创建空文件
$ vim 文件名
cp复制文件或目录
语法:cp [选项] source dest
source是源文件dest可以是目标文件夹也可以是文件,用于覆盖
选项:-r递归复制整个文件夹
1.将文件复制到指定文件夹下或替换某一文件
$ cp 文件名 文件夹
2.强制替换,直接使用linux下的原生命令 cp 等于cp -i 交互式,是它的别名,反斜杠是原生命令
$ \cp 文件名 文件名
3.递归复制文件夹,-r, recursive
$ cp -r 文件夹
rm删除文件或目录
remove
rm [选项] 文件名
选项:
-r 递归删除所有内容
-f 强制删除不确认
-v 显示删除过程的细节
1.交互式命令 rm=rm -i,删除会有提醒
$ rm 文件名
2.强制删除不要提醒
$ rm -f 文件名
3.强制删除根目录下所有内容
$ rm -rf /*
4.强制删除一个文件夹
$ rm -rf 文件夹
5.删除软链接
$ rm -rf 软链接名
6.删除软链接真实文件夹下的所有内容,而软链接不动
$ rm -rf 软链接名/
mv移动文件与目录或重命名
文件名可以带路径
重命名语法: mv oldname newname
移动语法:mv 文件名 目的文件夹
1.重命名
$ mv a b
2.移动文件并重命名
$ mv a dir/b
cat查看文件
catch,捕捉,仅查看,不修改,不会进入编辑器,直接在控制台查看的。
语法: cat [选项] 文件名
选项:-n 显示所有行号 包含空行
more文件分屏查看器
more是基于vi编辑器的文本过滤器,全屏显示文本
不如直接用vim算了。
语法:
more 文件名
less也可以
echo输出到控制台
echo [选项] [输出内容]
选项:-e接收反斜线控制的字符转换就是转义字符
1.给啥输出啥,输出 hello\nworld!
$ echo "hello\nworld!"
2.输出带转义字符的 hello world
$ echo -e "hello\tworld"
输出重定向>和追加>>
1.把列表内容写入新文件里
$ ls -l > 文件名
2.追加到某文件里
$ ls -al >> 文件名
3.内容覆盖
$ cat 文件1 > 文件2
4.一个文本的内容追加到另一个文本
$ cat 文件1 >> 文件2
5.内容追加到文件,不仅是字符串,还可以是环境变量
$ echo "内容" >> 文件名
echo查看环境变量
1.显示全部环境变量,然后按一下tab补全就可以看到全部环境变量
$ echo $
2.显示指定环境变量
$ echo $USER
$ echo $PASH
head显示文件头部内容
1.默认查看前十行
$ head 文件名
2.选项 -n 数字 显示前几行
$ head -n 4 文件名
tail显示文件尾部内容
1.默认查看后十行
$ tail 文件名
2.选项 -n 数字 显示后几行
$ tail -n 4 文件名
3.实时显示文件所有更新
$ tail -f 文件名
ln软链接
link,创建一个链接,即创建一个快捷方式(内存指针,指针里放的是一个地址),就是一个文件而非副本。
语法:ln -s [源文件或目录] [软连接名]
$ ln -s /root/info myInfo
获取日期
1.获取日期
$ date
2.同步始终
$ ntpdate 服务器名
3.获取近n个月日历
$ cal -n
4.显示某一年日期
$ cal 2022
添加查看用户
1.添加用户
$ useradd xiaojiang
$ userdel xiaojiang
删除用户及其数据
$ userdel -r xioajiang
2.更改密码
$ passwd xiaojiang
3.切换用户switch user
$ su xiaojiang
4.查看自己是谁
$ who
sudo设置普通用户具有root权限
临时获取超级管理员的权限。
语法:sudo + 命令
/etc/sudoers配置了哪些用户可以使用sudo命令。
$ sudo vim /etc/sudoers
文档属性和权限
linux属于多用户系统,不同的用户拥有不同权限,ll或ls -l可以用于查看文件属性。
属主:文件创建者
属组:属于的用户组其他的用户的权限。
Bit0: l表示连接文件,d表示目录文件夹,c表示字符类型的设备文件例如鼠标键盘,和b表示块设备文件,如硬盘,-表示普通文件。
查看设备类型:
$ ll -s /dev
chmod更改文件权限
1.语法:chmod [{ugoa}{+-=}{rwx}] 文件或目录
a表示全部权限类型,+增加权限,-删除权限,=权限赋值,
$ chmod u+x filename.txt
2.使用模式代码r=4 w=2 x=1 rwx=7进行组合三位二进制111=7
$ chmod [mod=421][文件或目录]
3.赋予最大权限 属主 属组 其他用户,644 700等
$ chmod 777
4.修改整个文件夹内的所有文件
$ chmod -R 777 xiaojiang/
chown改变文件拥有者
change owner
语法:chown [选项] [最终用户] [文件或目录]
选项:-R 递归操作
chgrp改变属组
语法:chown [选项] [属组] [文件或目录]
这需要超级管理员权限,切换到root下就可以。
find查找定位文件
语法:find 文件夹(默认是当前目录) [选项] 搜索名
选项:-name 文件名搜索(可以不完整)
-user 用户名搜索
-size 大小
$ find /root/文档 -name info
$ find /root/文档 -name “*.cfg”
$ find /root/文档 -size +10M
locate定位文件
相当于把系统文件做成了数据库,但是需要使用前更新一下数据库
$ updatedb
$ locate tmp
which可以查找命令在哪
$ which ls
$ whereis ls
grep过滤查找及管道符|
语法: grep [选项] 查找内容 源文件
选项:-n显示行号
$ ls | grep -n test
管道符:将前面的命令传送到后面作为参数
gzip与gunzip
gzip只能压缩文件不能压缩目录,并删除源文件。
$ gzip 文件
$ gunzip 文件.gz
zip unzip
可压缩文件或目录
语法: zip [选项] 新名字.zip 要压缩的内容
选项:-r 压缩目录
语法:unzip [选项] xxx.zip
选项:-d<目录>
tar打包
结合使用了linux自带的gzip工具
语法:tar [选项] xxx.tar.gz 要打包进去的内容
选项:结合使用,顺序都可以
$ tar -zcvf test.tar.gz t1.txt t2.txt t3.txt
$ tar -zcvf test.tar.gz test/
$ tar -zxvf test.tar.gz -C testunzip/
文件树
安装
yum install tree
查看目录树
tree ./
du查看文件和目录占用的磁盘空间
disk usage磁盘占用情况
du 目录/文件
-h human以人类易于阅读的方式
$ du -sh /root
df查看空间使用情况
disk free剩余空磁盘
$ df -h
$ free -h
lsblk查看设备挂载情况
lsblk :list block 查看块设备
选项 -f显示文件系统信息
$ lsblk -f
mount 和umount
挂载:Linux没有分区,整个是一个文件系统,哪个目录对应在哪个分区是有映射关系的,由挂载点决定,/boot分区,swap分区为交换分区即虚拟内存,剩下的为目录下的分区。
/mnt文件夹是用于挂载外部光盘的挂载点。在mnt下就能访问光盘。
$ mount 挂载前的目录 更换的挂载点
$ mount /dev/cdrom /mnt/cdrom
fdisk硬盘分区
fdisk -lsu
ps查看当前系统进程状态
process status,只显示用户调用的进程,
语法:ps aux | grep xxx
ps -ef | grep xxx
选项:
不加-的是BSD风格,加-表示UNIX风格
1.以文档页面查看,可以看到CPU占用率
$ ps aux | less
2.可以看到进程的父进程
$ ps -ef
3.筛选
$ ps -ef | grep bash
PPID 父进程ID
系统进程父进程2号进程,0号进程是idll,即第一个启动的进程,运行在系统内核态。
kill终止进程
语法:kill [选项] 进程号
killall 进程名称(支持通配符)
选项:-9 强迫进程终止
查看命令/进程状态
$ systemctl status sshd
$ kill -9 进程号
pstree进程树
pstree [选项]
-p 显示进程ID
-u 显示所属用户
$ pstree
top实时监控系统进程状态
语法: top [选项]
选项: -d 秒数 每隔几秒更新
-i 不显示闲置或僵死进程
-p 通过指定监控进程ID来仅仅监控某个进程的状态
ni 表示Nice值 res为实际物理内存 shr为虚拟内存
netstat显示网络状态和端口占用信息
看该进程网络信息
netstat -anp | grep 进程号
查看网络端口号占用情况
netstat -nlp | grep 端口号
选项:
socket形式: IP:PORT
0.0.0.0表示本机所有的IP地址,包括本地创建的虚拟网络的地址,和本机的地址,127.0.0.1 本地回环地址用于测试使用,相当于localhost。
sshd对应的是远程虚拟机服务器local address22固定端口,本机出去的地址foreign address是随机化的
crontab系统定时任务
指定固定时间点可以做哪些工作。可以每天用git拉代码。
重新启动crond服务
$ systemctl restart crond
crondtab [选项]
软件包管理工具
ubuntu使用的是apt软件管理工具
centos属于红帽系列,使用的rpm(redhat package manager),打包安装工具。
RPM查询命令rpm -qa
$ rpm -qa | grep firefox
$ rpm -qi firefox
rpm删除软件
$ rpm -e RPM 软件包
$ rpm -e nodeps 软件包
yum一键安装
yum:yellow dog Updater modified,主要用于红帽的各个发行版本shell前端软件包管理器,自动处理依赖关系。
shell编程
shell是命令行解释器,翻译官。解释用户命令,调用内核。
脚本:一行一行的命令行
将shell可以当成一个编程语言去学。
cat /etc/shells
ubuntu使用的是dash
脚本的常用执行方式:
#!/bin/bash
$ echo "hello world"
1.sh 脚本的绝对/相对路径
$ sh hello.sh
bash 脚本的绝对/相对路径
是把hello.sh当成bash命令的参数传入的,只要有执行bash的权限就有运行脚本的权限。
2.直接输入脚本文件名
直接把这个脚本当成可执行文件或者说命令,就需要添加可执行权限。
把脚本添加成可执行文件 chmod +x scripts/hello.sh
不加./会主动到bin文件夹去搜寻命令,加./表示当前文件夹下的。
$ ./hello.sh
3.source 或.
子shell,又起的一个bash,
.命令是bash内嵌命令。
source是 c shell的命令
./或 sh bash的方式都是在当前环境下重启一个子shell进程,进行命令 的执行,如果在这些方式下修改脚本的环境变量,退回到父shell时环境变量可能仍未改变,而source或.是在当前shell环境中执行脚本,可以认为是执行完就更新了环境变量,无父子嵌套环境。
$ source hello.sh
$ . hello.sh
开子shell与不开子shell的区别在于开了子shell的其设置的当前变量在父shell中是不可见的。
变量
变量分为系统定义变量和用户定义变量,
或分为全局变量和局部变量,这里的全局表示对所有子shell环境可见,局部对子shell也不可见。
常用的系统预定义变量:$开头并且是拳打希望
$HOME
$PWD
$SHELL
$USER
0.查看系统全局变量
$ env
1. printenv 变量
$ printenv $USER
2.printenv 命令
$ printenv USER
3.显示当前shell中所有变量 全局或局部
$ set
4.撤销变量
$ unset
5.局部变量提升为全局量
$ export**用户自定义变量/*kuaidi1
单引号和双引号皆可以。
将父shell定义的环境变量导出为全局变量,即对子shell环境也可见。
$ export $my_var
source 等价于先exprot再./
默认全部类型都是字符类型。
定义只读变量:只读变量不能使用unset撤销。
$ readonly a=10
$ unset a
如果想在命令行直接输入hello.sh就执行命令,需要将hello.sh移动到/bin目录下,但该目录下通常是系统命令
$ echo $PATH
可以显示全部的默认执行路径,可以把当前这个脚本的路径添加到默认路径下面
特殊变量——输入参数
语法: $n
0表示脚本名称,1-9表示第1到9个参数。10以上的参数需要用大括号如${10}
双引号输出变量
$ echo "$n"
单引号输出字符串
$ echo '$n'
脚本输出
$ echo "$1"
$#获取参数个数
获取所有参数个数,通常用于循环判断参数个数是否正确。
$* 获取当前命令行中的所有参数,看成一个整体
$@ 获取当前命令行的所有参数,区分对待每一个参数,放进来数组。
$? 最后一次执行命令的返回状态
$? 最后一次执行的命令的返回状态,0表示正确执行,非0不正确执行。
127表示没找到命令。
运算符
expr 表达式 注意运算符之间空格
expr 2 * 4
$((运算式))
$[运算式]
$ a=$[2*3+4]
$ echo $a
条件判断
test condition
等价于 [ condition ]
再调用$?查看上一次执行的命令的返回状态
为真返回0 为假返回1
注意conditon前后皆有空格
等号两边空格
$ [ $a = 1 ]
举例:
当成字符串比较:
$ [ 2 = 8 ]
当成整数比较
$ [ 2 -lt 8 ]
判断文件是否有可执行权限?
$ [ -r hello.sh ]
$ [ -w hello.sh ]
$ [ -x hello.sh ]
多条件判断
&&
||
组合用法:
如果cond1为真接下来判断cond2
否则 接下来判断cond3
cond1 && cond2 || cond3
if单分支
1.
if [ condition ];then
程序
fi
2.
if [ condition ]
then
程序
fi
3.
if [ con ]
then
程序
elif [ con ]
then
程序
elif [ con ]
then
程序
else
程序
fi
举例
!#/bin/bash
#加一个x的原因是 防止没给参数时 程序报错缺少参数
if [ "$1"x = "xiaojiang"x ]
echo "welcome Mr. Zhang"
fi
[ condition ] condition内部可以使用-a表示逻辑与
case语句
语法:每一行模式匹配以右括号结束 双分号表示命令序列结束 相当于break *) 表示default
case $变量名 in
"val1")
do...
;;
"val2")
do...
;;
"val3")
do...
;;
#如果都不是以上的值
*)
do...
;;
esac
举例
case $1 in
1)
echo "1"
;;
2)
echo "2"
;;
3)
echo "3"
;;
#如果都不是以上的值
*)
echo "x"
;;
esac
for循环
for((初始值;控制条件;变量变化))
do
程序
done
for((i=1;i<100;i++))
do
sum=$[ $sum + $i ]
done
for os in linux windows macos
do
echo $os
done
for i in {1..100}
do
sum=$[ $sum + $i ]
done
while循环
语法:[]或(())也可以
while [ condition ]
do
程序
done
read读取控制台输入
read (选项) (参数)
-p 指定读取值时的提示符,字符串
-t 指定读取值时等待的时间,秒,不加-t表示一直等待。
$ read -t 10 -p "Input:"
basename截取路径中的文件
注意命令替换的格式
$ file=$(dirname $1)
basename [文件的路径] [后缀]
功能:取路径里的文件名。指定suffix会去掉文件后缀名。
$ basename /usr/bin/scripts/xiaojiang.txt .txt
!#/bin/bash
filname=$(basename "$1" "$2")+$(date+s%)
echo $filename
dirname截取路径
!#/bin/bash
$ dirname /home/文档/xiaojiang/hello.sh
注意命令替换的格式
$ file=$(dirname $1)
自定义函数
function] funcname()
{
do...
return int#结果只能是0-255
}
正则表达式
1.常规匹配,不包含特殊字符。展示包含该字符的所有内容
$ cat /etc/passwd | grep xiaojiang
2.^ 匹配一行的开头
$ cat /etc/passwd | grep ^xiaojiang
3.$匹配一行的结束
$ cat ./test.sh | grep zhang$
4.^$匹配空行
$ cat ./test.sh | grep -n ^$
5. .匹配任意一个字符 控制个数
$ cat ./test.sh | grep mr.....g
6. *匹配上一个字符0次或多次 mg mrg mrrg
$ cat ./test.sh | grep mr*g
7. .*表示任意数量任意字符
$ cat ./test.sh | grep m.*g
8.[]匹配字符区间 ?
$ cat ./test.sh | grep m[a,r]
$ cat ./test.sh | grep m[a-z]*g
9.转义字符,用于匹配特殊字符,'\$'表示匹配$
10.匹配手机号 {n}重复n次
$ echo "15212779769" | grep -E ^1[3456789][0-9]{9}$
文本处理工具
cut
从文件的每一行剪切字节字符字段并输出
cut [选项] filename
默认分隔符是制表符
选项:
-f 列号
-d 分隔符
-c 按字符进行切割 后接数字表示第几列
*
read (选项) (参数)
-p 指定读取值时的提示符,字符串
-t 指定读取值时等待的时间,秒,不加-t表示一直等待。
$ read -t 10 -p "Input:"
basename截取路径中的文件
注意命令替换的格式
$ file=$(dirname $1)
basename [文件的路径] [后缀]
功能:取路径里的文件名。指定suffix会去掉文件后缀名。
$ basename /usr/bin/scripts/xiaojiang.txt .txt
!#/bin/bash
filname=$(basename "$1" "$2")+$(date+s%)
echo $filename
dirname截取路径
!#/bin/bash
$ dirname /home/文档/xiaojiang/hello.sh
注意命令替换的格式
$ file=$(dirname $1)
自定义函数
function] funcname()
{
do...
return int#结果只能是0-255
}
正则表达式
1.常规匹配,不包含特殊字符。展示包含该字符的所有内容
$ cat /etc/passwd | grep xiaojiang
2.^ 匹配一行的开头
$ cat /etc/passwd | grep ^xiaojiang
3.$匹配一行的结束
$ cat ./test.sh | grep zhang$
4.^$匹配空行
$ cat ./test.sh | grep -n ^$
5. .匹配任意一个字符 控制个数
$ cat ./test.sh | grep mr.....g
6. *匹配上一个字符0次或多次 mg mrg mrrg
$ cat ./test.sh | grep mr*g
7. .*表示任意数量任意字符
$ cat ./test.sh | grep m.*g
8.[]匹配字符区间 ?
$ cat ./test.sh | grep m[a,r]
$ cat ./test.sh | grep m[a-z]*g
9.转义字符,用于匹配特殊字符,'\$'表示匹配$
10.匹配手机号 {n}重复n次
$ echo "15212779769" | grep -E ^1[3456789][0-9]{9}$
文本处理工具
cut
从文件的每一行剪切字节字符字段并输出
cut [选项] filename
默认分隔符是制表符
选项:
-f 列号
-d 分隔符
-c 按字符进行切割 后接数字表示第几列
awk命令
格式:awk option ‘pattern {action}’ file
例子:awk -F ‘:’ /root/{print $3}’ /usr/my.txt
-F:指定用什么符号分割,用:分割字符串
/root/只处理带有root的行
{print $3}打印第三个字段
/usr/my.txt指定所操作的文件