上周五,由于我的操作失误,导致服务在生产环境意外挂掉,持续时间将近40分钟,最后事故还原排查下来发现是我执行Linux Shell重启脚本导致意外将网关服务关闭了。小组长给我打了很多次电话,这次事故连带他也被罚钱了。事后想想,觉得真的有必要好好学习一下Linux常用的基础命令,话不多说,直接开搞。
路径
常见路径
/ #根路径
~/- #家路径
. #当前目录所在路径
.. #父目录所在路径
1.绝对路径
绝对路径是从根目录下面开始的路径,根路径为/,一般登录服务器之后就进入到对应的用户家目录中,用户的家目录用~表示,假设用户名是xiaoming,则绝对路径以/xiaoming开头,后面跟上具体的路径,比如用户目录下的tomcat下的test目录中,绝对路径表示就是/xiaoming/tomcat/test
2.相对路径
相对路径是相对当前所在的路径,当前路径为.,相对当前目录退后的目录,则以../开头,相对当前路径往前的目录以./开头或者具体目录test/,test必须在当前路径中存在
3.路径命令
cd#跳转到具体的某个路径
pwd#打印当前所在目录的绝对路径
目录文件
1.创建
mkdir:创建目录
mkdir test #创建test目录
mkdir -p test\shell\tomcat #递归创建目录
touch/echo/vim:创建文件 创建文件有很多中方式,重定向或者vim或者touch方式都可以创建
touch file1.txt #创建file1.txt文件
echo ''> file1.txt #空字符串重定向到file1.txt,不存在时默认就会创建文件
vim file1.txt #vim编辑file1.txt,没有的话也会默认创建
2.复制\移动
cp:复制
cp -r test 路径 #-r参数表示把整个test目录复制到指定路径下
cp -p file1.txt file2.txt file3.txt #-p参数表示保留原文件属性复制,包括创建时间,权限等
move:移动
move test 路径 #将test目录移动到某个路径下
move file1.txt file2.txt #将file1.txt重命名为file2.txt
3.删除
rm file1.txt file2.txt file3.txt #删除文件
rm -rf test 路径 #-r参数表示把整个test目录及子目录下的内容全部删除
4.查看文件内容
cat:查看文件完整内容
less:分页查看文件内容
b:往前一页 u:退后一页 q:退出查看模式
tail:可实现实时查看
-f:默认1s实时更新文件内容到屏幕上
-s:指定更新时长,以秒为单位
vim:打开文件查看文件内容
vim是linux一款文件编辑软件,使用改命令打开的文件内容,可以使用软件常用的命令去增删改查文件内容,使用vim打开的文件内容默认处于不可编辑模式,通过i命令可进入编辑模式,按ESC键又进入不可编辑模式
ESC模式下常用命令如下
i #从当前光标处开始编辑 A #定位光标到所在行末尾并进入编辑模式 G #跳转到最后一行 gg #跳转到第一行 n G #跳转到第一行的行首 HOME键 #快速跳转到当前行的行首 END键 #快速跳转到当前行的行末 dd:删除光标所在行 :set nu #显示行号 :%s/old/new/g #全局将old字符替换为new字符 :q! #直接退出,不保存,在对文本操作失误的时候非常好用 :wq #保存文本修改并退出
环境变量
一般我们的应用是微服务架构部署,涉及到注册中心、网关、具体的应用服务等,如果对应的脚本都放在同一台服务器上,每次都需要跳转到具体脚本所在目录下执行,服务很多的时候会非常费劲,可以将脚本所在目录加到系统环境变量中,避免路径跳转的麻烦
1.当前终端有效
在当前窗口执行命令后,关闭当前窗口就失效
export PATH=/home/user/tomcat/shell:$PATH
2.同一个用户有效
在用户目录下找到.bashrc或者.profile文件文件后,在文件末尾加上命令后,执行source .bashrc或者执行source .profile命令生效,或者关闭当前窗口,重新登录后进来生效
export PATH=/home/user/tomcat/shell:$PATH
3.所有用户有效
在根目录下的配置文件目录/etc下面找到bashrc或者profile文件文件后,在文件末尾加上命令后,执行source /etc/bashrc或者执行source /etc/profile命令生效,或者关闭当前窗口,重新登录后进来生效,相当于是修改系统环境变量,对所有用户一直有效
export PATH=/home/user/tomcat/shell:$PATH
账户权限
Linux最大的优点就是安全性高,而Linux控制安全性能主要是通过区分用户并赋予他们不同权限达成的,Linux中所有目录、文件都有对应的权限,所谓权限主要指用户(u)/用户组(g)/其他用户(o)的读权限(r:4)、写权限(w:2)以及执行权限(x:1),可以通过修改文件或者目录权限值来控制访问。
1.账户
Linux中的用户包括root用户和其他的普通用户,用户又属于某个用户组,可以创建普通用户、用户组
常用命令如下
useradd xiaohong #新建用户xiaohong,并会默认创建一个与用户同名的用户组
userdel xiaohong #删除用户xiaohong,如果有用户登录xiaohong,则无法删除
su xiaohong #切换登录用户
passwd xiaohong #修改xiaohong账户的登录密码
groupadd classmates #新增用户组classmates
groupdel classmates #删除用户组classmates
groups xiaohong #查看xiaohong所在的用户组
usermod -g classmates #将xiaohong加入到classmates用户组下面
chown命令
要有root权限之后才能修改文件的所属用户或者所属用户组
chown -R xiaohong:xiaohong test #-R参数针对目录进行递归,修改test用户的所属用户和所属用户组为xiaohong
chown :xiaohong test.txt #单独修改文件的所属用户组为xiaohong
2.权限
当我们在某个目录下面执行ll命令时,就会将当前目录下的所有目录和文件对应的权限、所属用户、所属用户组、大小、创建日期等详细信息打印出来,如下图所示
drwxr-xr-xd:表示文件类型,linux中的常见文件类型就是目录(d)和一般文件(-)
rwx:表示文件所属用户具有读写执行权限
r-x:表示文件所属用户组具有读、执行权限
r-x:表示其他用户具有读、执行权限
在Linux中,每种权限对应一个数字r:4,w:2,x:1,假如所属用户的权限为rwx时,对应权限值为7,加上所属用户组以及其他用户的权限,目录最高权限值就是777,而文件最高权限值是666,因为赋予文件执行权限安全要求比较高,而一般登录进入用户目录下创建文件或者目录都默认有一个权限值的设定,这个默认权限可以通过umask命令来设置
命令行执行umask可以查看当前系统的默认权限值为0022,而默认的目录最高权限值为777,与运算后得出目录的默认权限为755,而文件最高权限为666,与运算结果为644,所以系统默认的目录权限值rwx r-x r-x,默认文件权限为rw-r--r--,可以通过在终端输入umask 0033来改变文件或者目录默认的权限
2.1 文件和目录权限的区别
目录
读权限:可以执行ll或者ls等命令查看目录下面的文件、子目录信息
写权限:可以在目录下执行
mkdir/touch/rm -rf/cp/mv等命令,写权限是目录的最高权限执行权限:可以
cd进入改目录
文件
读权限:可以通过
cat/less/tail/echo等命令查看文件内容写权限:可以通过
vim/sed等命令编辑文件内容(删除文件要所在目录有写权限)执行权限:文件符合语法规范可执行的条件下,执行
sh test.sh或者./test.sh的命令执行
2.2 修改权限命令
只要登录用户是文件/目录的所属用户,就可以修改文件或者目录权限,不需要root权限
chmod -R 777 test #递归修改test目录下的文件及子目录的权限为777
chmod u=rwx,g=rx,o=rx file1.txt #单独设置每种所有者的权限
chmod u-x,g+w,o-wx #通过删减权限的方式设置每种所有者的权限
查找处理
1. 查找文件
find命令
find命令是在指定路径下根据关键字递归查找某个文件,一般常用的是通过名字查找,名字可以进行正则匹配,通过
find --help命令可以查看更多用法,这里只例举常见用法格式:
1.find [路径] -iname -type f 'test.txt'
-name表示按名字查找,i表示忽略大小写
-type f表示文件类型是文件,可选值还包括d表示目录文件
locate命令
locate命令默认情况下是查询文件数据库得到结果,在根路径下面查找所有匹配文件,包括目录和普通文件,可能不是最新的,可以通过执行
updatedb来更新数据库数据。
locate access.log#查找access.log文件
2.查找文件内容
grep命令
默认情况下,搜索关键字所在行并打印到屏幕上,默认高亮匹配内容
命令格式: grep [选项] "关键字" 目标文件
常用选项如下
-C N #默认情况只打印匹配行,-C表示打印前后N行 -i #忽略大小写匹配关键字 -n #显示所在行的行号 -w #为一个独立的单词匹配,其他连着的不匹配 -v #反向匹配,表示匹配的不打印,不匹配的打印 -q #静默模式,不打印任何输出,匹配上后通过$?返回匹配结果 -r #递归查找,在某个目录下面递归查找所有匹配上关键字的文件并打印匹配行的内容 -e #指定多个表达式,表达式之间是或的关系 -o:只显示匹配到的字符-r举例
-e举例
3.处理文件
压缩与解压缩
tar -zcvf test.tar.gz file1.txt file2.txt #将file1.txt、file2.txt压缩为file.tar.gz文件
tar -zxvf test.tar.gz #将压缩包解压
重定向与管道
管道|:管道的一般用法是将左边命令的输出作为右边命令的输入,好处在于简化操作,将同一段内容连续处理后得到最后需要的结果
cat file1.txt|grep '周深' #将cat命令结果也就是file1.txt的文件内容作为grep操作的内容
重定向:重定向表示流操作,将某段内容重定向到标准输出(stdin)、标准输出(stout)、标准错误输出(sterror)或者某个文件中
常见用法如下
>file1.txt #覆盖输出,文件不存在则创建,文件存在则重置文件内容,不是追加,如果想清空文件内容,可以通过echo "">file1.txt实现
>> file1.txt #追加输出,文件不存在则创建,文件存在则追加
2> #标准错误输出
2>&1 #标准错误输出方式与标准输出保持一致
>/dev/null 2>&1 #标准输出到一个并不知道的目录,错误输出也保持一致,常用于不打印日志的时候
cat < file1.txt#输入重定向,将某个文件内容作为另外一个命令的输入
<< END #将END符号作为键盘输入的结束标志,并将所有键盘输入作为另外一个命令的输入
用法示例一:不打印日志
用法示例二:键盘输入结束符
awk命令
awk命令是一种格式化文本语言,有固定的语法,对内容逐行分割筛选处理或者拼接后得到最后想要的结果,在写脚本时常用来处理获取某个进程id,如下图所示
命令格式:awk [选项] 'pattern {action}'
1.选项
-v #主要用来指定变量,包括内置变量和自定义变量,常用来指定输入分隔符(FS)和输出分隔符(OFS)
#默认的输入和输出分隔符都是空格,连续空格也看做一个空格处理
#例如:
awk -v FS=',' -v OFS='##'
一些常用的内置变量如下
$0:整行数据
$NF:整行的最后一列
NF:字段的数量,共几列
RS:指定输入换行符
ORS:指定输出换行符
FS:输入分隔符,默认值为空格,也包括连续空格
OFS:输出分隔符,默认为空格
FILENAME:当前处理的文件名
NR:对应行号
FNR:各文件分别计数的行号
ARGC:命令行参数个数
ARGV:数组,保存各命令行所指定的各参数 2.pattern模式匹配
pattern模式常用来筛选某一行,筛选条件常取的是列值,列值通过指定分隔符分隔得到
通过$N指定第几列,筛选常使用表达式运算(>或>=或<或<=或!=或==)、~ /正则表达式/、!~ /正则表达式/,值为true则选中处理。另外,还有两个特殊的模式,用来在所有行处理前或者处理后执行的操作。BEGIN 用来在所有行处理之前的操作 END,用来在所有行处理之后的操作。
- 正则表达式:通过/正则表达式/来匹配某行
- 运算符匹配:通过取出某列的值进行运算符运算后结果为true则匹配上
(1)数学运算 <、>、<=、>=、=、!=
ps -ef|grep nginx |grep -v grep |awk '$2==167{printf "%s\n",$0}'
(2)正则运算
~ /REX/、!~ /REX/
ps -ef|grep nginx |grep -v grep |awk '$11 ~ /nginx$/{printf "%s\n",$0}'
(3)逻辑运算
||、&&、!
ps -ef|grep nginx |awk '/nginx$/ && $8 ~ /^nginx/ {printf "%s\n",$0}'
3.action操作
常用的操作包括print/printf,两者的区别是print每次换行打印,后者不换行打印,使用printf打印可以指定格式,有点类似C语言中的printf函数
%s #打印字符串
%d #打印数字
%f #打印浮点数
%x #打印16进制数
%o #打印8进制数
%e #打印科学计数
%c #打印单个字符的ASCII码
- #左对齐打印
+ #右对齐打印
{printf "%s\n",$0}` #换行打印,默认不换行
另外,在打印输出过程中,想要对结果列做统一处理之后再输出,可以使用一些特殊函数来处理,这些函数也可以出现在筛选目标行的过程中
length:获取字符串长度
index(str1,str2):查看str2子串在str1中的匹配索引位置
tolower(str):字母统一小写处理
toupper(str):字母统一大写处理
split(str,arr,fns):将str按照fs执行分隔符分割之后放到数组arr中
substr(str,m,n):从m位开始截取n位,n未指定则截取到字符串的结束
sub(RE,ReqStr,str):从str查找到的第一个匹配的,并替换为ReqStr
gsub(RE,ReqStr,str):与sub不同的地方在于替换所有匹配到的目标字符串
#先替换再输出
echo "study shell awk 1day" |awk '{sub(/[0-9]+/,"some",$0);printf "%-10s\n"
,$0}'
使用举例
步骤一:将nginx启动,输出打印ps -ef|grep nginx |grep -v grep
将nginx进程id打印出来
ps -ef|grep nginx |grep -v grep|awk '$1 ~ /root/ {print $2}'
将root用户所在行的部分数据并以##分隔输出
sed命令
命令格式:sed [参数选项] '[L1[,L2]]操作',sed命令常用来对文件进行批量操作,对匹配行逐行处理
参数选项
n #出被处理的那一行数据,取消默认输出(全部数据 i #修改文件内容 f #ed命令保存在文件中,然后sed -f file.sed命令执行sed命令筛选
L1 #筛选出L1列 L1,L2 #筛选出L1和L2列 /正则表达式/ #正则表达式匹配所在的行操作
a:在匹配行的下一行新增内容 i:在匹配行的上一行新增内容 p:打印输出内容 d:删除选中行 s:修改内容,格式为s/old/new/g c:内容取代匹配的行全部内容 ![操作]:表示反向操作,对不匹配的行进行操作 {操作;操作}:可以指定多个顺序操作,{}括起来,操作之间;分隔
使用举例
将包含林的行删除
sed -i '/林/d' file2.txt
将王五更改为赵六
sed -in '/张三/s/王五/赵六/g' file2.txt
统计
wc命令:统计指定文件信息,默认输出文件行数,单词数,字节数
wc restart_test.sh #统计restart_test.sh文件信息参数选项
-l:只统计行数
-m:只统计字符数
-w:只统计单词数
-c:只统计字节数
du命令:查看当前目录下的目录及文件大小
参数选项
-h:文件大小以k/M的方式打印,更适合阅读
-a:同时列举出子目录下面的文件大小
-s:只统计文件目录的总大小
sort命令:将结果进行排序
参数选项
-n:按照数字排序
-r:倒序排序
-t:指定分隔符
-k:获取分隔后的第几列
-o filename:将最后排序的结果又写入到原文件中
-u:去除重复行进行排序
-f:忽略大小写进行比较
-b:忽略每一行前面的所有空白部分,从第一个可见字符开始进行比较tr命令:字符串进行大小写替换
tr '[a-z]' '[A-Z]' tr '[A-Z]' '[a-z]' tr /a-z/ /A-Z/
网络
常用涉及进程或者网络的命令如下:
ping 域名或者ip:查看是否能够ping通对方主机,但如果对方主机关闭ping探测,就不能ping通
telnet 域名或者ip 端口:查看某个主机上的端口是否打开
lsof -i 8099:查看本机上的8099端口是否被占用
telnet -tunlp|grep 8099:查看8099对应端口进程的cpu/进程id/内存的占用情况
top -c:获取实时动态的主机进程详细占用信息
总结
这篇文章,编写了一天时间,对这周趁着上班时间学习的知识做了一个归纳总结,第一次写这样的技术文章,发现把自己学会的东西讲清楚我还有很多路要走,后面我会继续努力,持续更新所学所想,与大家一起分享。文章如有不足之处,欢迎大家留言、评论指正,点赞、收藏也可以,谢谢啦!