Linux Shell

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指定所操作的文件

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值