本篇博文总结常用的shell命令,比较基础,作为备忘待使用时查阅吧,有问题可及时在个人博客或本博客下留言。
shell基础
快捷键:
Ctrl+W
:删除光标位置前单词
Ctrl+U
:清空行
上下方向键:查看历史命令
Tab
:自动补全
Ctrl+R
:搜索先前使用的命令
Ctrl+C
:中止当前命令
Ctrl+D/logout/exit
: 退出登录shell
ESC+T
: 调换光标前的两个单词
cat /etc/shells
: 查看系统中所有可用的shell
echo $SHELL或ps -p $$
: 查看账号当前使用的Shell类型
shell脚本构成:
- shell关键字:例如if…else,for do…done
- shell命令:例如export,echo,exit,pwd,return
- linux命令:如date,rm,mkdir
- 文本处理功能:如awk,cut,sed,grep
- 函数:通过函数将一些常用的功能放在一起,例如/etc/init.d目录中的大部分或全部系统shell脚本所使用的函数都包含在文件/etc/init.d/functions中
- 控制流语句:例如if…then…else或执行重复操作的shell循环
创建一个shell脚本需要以下三步:写一个脚本,允许shell执行它,把它放到可以找到的地方
下面是一个脚本示例:
#!/bin/bash
#My first script
ls -l .*
第一行告诉shell使用什么程序解释脚本,本例中使用/bin/bash,其他脚本语言如Perl,awk,python等也同样使用这个机制
第二行是一个注释,#后面的任何内容都会被bash忽略
文件保存后,默认情况下linux是不允许执行的,需要通过chmod命令授予可执行权限chmod 755 文件名
之后就可以直接运行脚本了
用户登录时,登录shell调用的初始化文件和脚本的次序依次是:/etc/profile,/etc/profile.d目录下的脚本、$HOME/.bash_profile,$HOME/.bashrc和/etc/bashrc
shell中变量类型
shell中变量类型有系统变量和用户自定义变量两种:
env/printenv
:查看当前shell的所有系统变量和用户自定义变量
如何定义变量和给变量赋值
varname=varvalue
注意等号的周围不要有任何的空格,否则会报command not found的错误
可以将任意字符集合赋值给一个变量,比如给一个变量赋值一个字符串
username=xiaowang 或者 username="xiaowang"
给变量赋值一个数字值:
var=1
使用变量通过$符号,
比如上面定义好了变量var,使用的时候,通过$var即可使用
默认情况下shell赋值是字符串赋值:比如下面示例,说明var变量被当做字符串了
[root@iZ23kwr96m6Z ~]# var=1
[root@iZ23kwr96m6Z ~]# echo $var+1
1+1
在Bash中,如果要将算数表达式的数值赋给一个变量,可以使用let
命令,如下示例(注意下面的区别):
[root@iZ23kwr96m6Z ~]# let age=1
[root@iZ23kwr96m6Z ~]# echo $age+1
1+1
[root@iZ23kwr96m6Z ~]# let age=1+1
[root@iZ23kwr96m6Z ~]# echo $age
2
将一个变量的值赋值给另一个变量:
[root@iZ23kwr96m6Z ~]# a=3
[root@iZ23kwr96m6Z ~]# b=$a
[root@iZ23kwr96m6Z ~]# echo $b
3
将命令的执行结果赋值给变量(注意命令使用倾斜的单引号括起来):
[root@iZ23kwr96m6Z ~]# pwd
/root
#下面例子没有使用倾斜双引号``,结果还是字符串赋值
[root@iZ23kwr96m6Z ~]# var='pwd'
[root@iZ23kwr96m6Z ~]# echo $var
pwd
#下面例子是正确的赋值操作
[root@iZ23kwr96m6Z ~]# var=`pwd`
[root@iZ23kwr96m6Z ~]# echo $var
/root
#使用$()将命令包起来也是正确的(推荐这种不容易写错)
[root@iZ23kwr96m6Z ~]# var=$(pwd)
[root@iZ23kwr96m6Z ~]# echo $var
/root
将bash的内置命令read
读入的值赋值给变量
[root@iZ23kwr96m6Z ~]# echo -n "Enter var:";read var
Enter var:123
[root@iZ23kwr96m6Z ~]# echo $var
123
上例的意思是打印内容"Enter var",不换行,之后再将用户输入的值赋值给变量var,所以我们通过echo $var
命令即得到变量var的值
变量命名规则
变量命名必须以字母,下划线_开头,后面跟字母,数字或者下划线字符,第一个字符不能为数字,中间不能使用?、*等特殊符号
变量名大小写敏感,不同大小写是不同的变量,如下例:
[root@iZ23kwr96m6Z ~]# var=123
[root@iZ23kwr96m6Z ~]# Var=345
[root@iZ23kwr96m6Z ~]# echo $var
123
[root@iZ23kwr96m6Z ~]# ?var=123
-bash: ?var=123: command not found
[root@iZ23kwr96m6Z ~]# 1var=123
-bash: 1var=123: command not found
[root@iZ23kwr96m6Z ~]# _var=111
[root@iZ23kwr96m6Z ~]# echo $_var
111
使用echo
和printf
打印变量的值
打印显示变量的值除了echo
命令外还有printf
命令,该命令语法格式如下:printf <FORMAT> <ARGUMENTS…>即根据指定格式打印参数,具体的允许格式如下:
分类符 | 描述 |
---|---|
%b | 打印相关参数并解释其中带有反斜杠\的特殊字符 |
%q | 以Shell引用的格式打印相关参数,使其可以在标准输入中重用 |
%d | 以带符号十进制数的格式打印相关参数 |
%i | 与%d相同 |
%o | 以无符号八进制数的格式打印相关参数 |
%u | 以无符号十进制数的格式打印相关参数 |
%x | 以无符号小写十六进制数的格式打印相关参数 |
%X | 与%x相同,只是十六进制数为大写 |
%f | 以浮点数的格式解析并打印相关参数 |
%e | 以双精度浮点数±e的格式打印相关参数 |
%E | 与%e相同,只是用大写字母E |
%g | 以%f或%e的格式打印相关参数 |
%G | 以%f或%E的格式打印相关参数 |
%c | 以字符的格式打印相关参数,并且只打印参数中的第一个字符 |
%s | 以字符串的格式打印相关参数 |
%n | 指定打印的字符个数 |
%% | 打印一个字符"%" |
printf命令的格式用字符串<Format>中还可以使用一些转义字符,如下所示
转义符 | 描述 |
---|---|
\" | 打印双引号 |
\NNN | 用八进制的值表示一个ASCII字符,例如\101,即65,表示字符’A’ |
\\ | 打印一个反斜杠"\" |
\a | 发出告警音 |
\b | 删除前一个字符 |
\f | 换页符,在某些实现中会清屏,有些会换行 |
\n | 换行 |
\r | 从行头开始,和换行不一样,仍在本行 |
\t | Tab键 |
\v | 竖直tab,和\f相似,不同机器显示有所不同,通常会引起换行 |
\xHH | 用十六进制的值表示一个ASCII字符,例如/x41,即65,表示字符’A’ |
下面是一些示例:
[root@iZ23kwr96m6Z ~]# var=shell
[root@iZ23kwr96m6Z ~]# printf "%s\n" $var
shell
#指定长度小于实际长度时,按照实际长度打印
[root@iZ23kwr96m6Z ~]# printf "%1s\n" $var
shell
#原点符右边的数字表示打印参数中字符的个数,左边表示打印字符串的总长度
[root@iZ23kwr96m6Z ~]# printf "%1.1s\n" $var
s
#当左边要求打印的总长度超过输出实际长度时,左边用空格补全
[root@iZ23kwr96m6Z ~]# printf "%10.4s\n" $var
shel
[root@iZ23kwr96m6Z ~]# str=123.45678
#打印的数值长度为5,保留小数点后1位数字
[root@iZ23kwr96m6Z ~]# printf "%5.1f\n" $str
123.5
[root@iZ23kwr96m6Z ~]# printf "%5.2f\n" $str
123.46
[root@iZ23kwr96m6Z ~]# printf "%5.3f\n" $str
123.457
[root@iZ23kwr96m6Z ~]# printf "%2.3f\n" $str
123.457
#小数点后不够的补零
[root@iZ23kwr96m6Z ~]# printf "%2.8f\n" $str
123.45678000
#打印的数值长度为9,数值的实际长度为7,保留小数点后3位,左边用空格补齐
[root@iZ23kwr96m6Z ~]# printf "%9.3f\n" $str
123.457
echo命令没有提供格式化的选项,但是支持转义符功能,在使用转义符时需要使用"-e"选项激活转义字符功能,如下
[root@iZ23kwr96m6Z ~]# echo -e "SHELL: $SHELL\n User:$USER\t"
SHELL: /bin/bash
User:root
有时需要通过${}来避免一些歧义,如下:
[root@iZ23kwr96m6Z ~]# echo "the shell path is $SHELL haha"
the shell path is /bin/bash haha
#下面的指令,shell会去查找SHELLhaha这个变量,没有找到所以打印出来为空
[root@iZ23kwr96m6Z ~]# echo "the shell path is $SHELLhaha"
the shell path is
[root@iZ23kwr96m6Z ~]# echo "the shell path is ${SHELL}haha"
the shell path is /bin/bashhaha
[root@iZ23kwr96m6Z ~]# echo "the shell path is ${SHELL}/haha"
the shell path is /bin/bash/haha
变量的引用
引用变量时,最好将变量用双引号括起来,比如"$var"以免变量中的特殊字符(除$、和\)被错误解释。使用双引号可以防止变量中由多个单词组成的字符串分离,一个用双引号括起来的变量使它自身变成一个单词,即使它包含空格,请看如下例子:
#将变量LIST的值分成了三个参数传递给了for循环
[root@iZ23kwr96m6Z ~]# LIST="ONE TWO THREE"
[root@iZ23kwr96m6Z ~]# for var in $LIST
> do
> echo $var
> done
ONE
TWO
THREE
#将变量LIST的值作为一个整体传递给了for循环
[root@iZ23kwr96m6Z ~]# for var in "$LIST"
> do
> echo $var
> done
ONE TWO THREE
只有变量的值中包含空格或要保留其中的空格时,将变量用双引号括起来才是必要的
#$(echo '"')相当于'echo '"''
[root@iZ23kwr96m6Z ~]# echo "$(echo '"')"
"
单引号的操作类似于双引号,只是它不允许引用变量,因为在单引号中字符"$"的特殊含义会失效
export语句的使用
用户登录到Linux系统后,系统将启动一个用户shell。在这个shell中,可以使用shell命令或声明变量,也可以创建并运行shell脚本程序。运行shell脚本程序时,系统将创建一个子shell。此时,系统中将有两个shell,一个是登录时系统启动的shell,另一个是系统为运行脚本程序创建的shell。当一个脚本程序运行完毕,脚本shell将终止,返回到执行该脚本之前的shell。
从这种意义上来说,用户可以有许多 shell,每个shell都是由某个shell(称为父shell)派生的。在子shell中定义的变量只在该子shell内有效。如果在一个shell脚本程序中定义了一个变量,当该脚本程序运行时,这个定义的变量只是该脚本程序内的一个局部变量,其他的shell不能引用它,要使某个变量的值可以在其他shell中被改变,可以使用export
命令对已定义的变量进行输出。
export
命令将使系统在创建每一个新的shell时,定义这个变量的一个拷贝。这个过程称之为变量输出。
export
功能说明:设置或显示环境变量。
语 法:export -fnp 变量名称=变量设置值
补充说明:在shell中执行程序时,shell会提供一组环境变量。export可新增,修改或删除环境变量,供后续执行的程序使用。export的效力仅限于该次登陆操作。
参 数:
-f 代表变量名称或者函数名称。
-n 删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。
-p 列出所有的shell赋予程序的环境变量。
所以得出的结论是:
1、执行脚本时是在一个子shell环境运行的,脚本执行完后该子shell自动退出;
2、一个shell中的系统环境变量会被复制到子shell中(用export定义的变量);
3、一个shell中的系统环境变量只对该shell或者它的子shell有效,该shell结束时变量消失(并不能返回到父shell中)。
4、不用export定义的变量只对该shell有效,对子shell也是无效的。
例如linux上配置java_home之后需要在/etc/profilewen文件尾部添加如下配置:
export JAVA_HOME=/usr/local/software/java/jdk1.8.0_231
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
如何删除变量
unset
命令用来删除相应的变量或者函数,该命令会把变量从当前shell和后续命令的环境中删除,语法如下:unset -fv 变量或函数名称
-f 表示删除一个已定义的函数;-v 删除一个变量,使用 示例如下:
export JAVA_HOME= /usr/local/jdk
unset JAVA_HOME
[root@iZ23kwr96m6Z ~]# var=123
[root@iZ23kwr96m6Z ~]# echo $var
123
[root@iZ23kwr96m6Z ~]# unset var
[root@iZ23kwr96m6Z ~]# echo $var
[root@iZ23kwr96m6Z ~]#
使用unset命令不能删除一个只读的变量,会报错,如下:
[root@iZ23kwr96m6Z ~]# readonly var=234
[root@iZ23kwr96m6Z ~]# echo $var
234
[root@iZ23kwr96m6Z ~]# unset var
-bash: unset: var: cannot unset: readonly variable
如何检查变量是否存在
使用如下的语法来检查变量是否存在:
${varName?Error:The variable is not defined}
${varName:?Error:The variable is not defined}
上述第一句中,如果变量varName已定义且不为空,则该语句相当于$varName;如果变量置为空,则该语句也为空;如果变量未定义,则此语句返回一个错误,显示?和后面的错误信息"Error:The variable is not defined"
第二句和第一句的唯一区别是,如果varName的值是空的,此语句也将返回一个错误
这两句可以用来检查脚本的完整性,如果变量未定义,脚本将会停止执行,如下例子
[root@iZ23kwr96m6Z ~]# age=123
[root@iZ23kwr96m6Z ~]# echo ${age?Error}
123
[root@iZ23kwr96m6Z ~]# unset age
[root@iZ23kwr96m6Z ~]# echo ${age?Error}
-bash: age: Error
[root@iZ23kwr96m6Z ~]# age=321
[root@iZ23kwr96m6Z ~]# echo ${age:?Error}
321
[root@iZ23kwr96m6Z ~]# unset age
[root@iZ23kwr96m6Z ~]# echo ${age:?Error}
-bash: age: Error
[root@iZ23kwr96m6Z ~]# age=456
[root@iZ23kwr96m6Z ~]# age=""
[root@iZ23kwr96m6Z ~]# echo ${age?Error}
[root@iZ23kwr96m6Z ~]# echo ${age:?Error} 带冒号的语法当值为空时也会报错
-bash: age: Error
shell环境进阶
标准命令为什么在shell的任何路径都能执行?这是因为shell在path环境变量指定的全部路径中搜索任何可执行文件,一旦找到与输入项匹配的命令就执行,下面进行进一步了解。
回调命令历史
曾经执行过的命令,会被保存在缓冲区或者默认文件~/.bash_history中,保存命令的多少由环境变量HISTSIZE
定义。
- 可以使用
history
命令显示你之前执行过的命令 - 可以在命令行提示符下使用上下方向键查找之前执行的命令
- 可以在命令行提示符下按ctrl+r组合键后输入相应的关键字,可以搜索历史命令
- 可以简单的输入!!来重复执行上一条执行过的命令
- !关键字 可以查找最近一次执行的以关键字开头的命令
- 可以使用history列出历史命令之后,使用对应的行号执行命令,如下:
[root@iZ23kwr96m6Z ~]# history
...
1041 echo ${age?Error}
1042 echo ${age:?Error}
1043 history
1044 ls
1045 uptime
1046 unset age
1047 history
[root@iZ23kwr96m6Z ~]# !1045
uptime
12:44:07 up 58 days, 19:18, 1 user, load average: 0.00, 0.01, 0.05
shell中的扩展
shell中扩展方式有八种(按照扩展的先后顺序排序):大括号扩展、波浪号扩展、参数和变量扩展、命令替换、算数扩展、进程替换、单词拆分和文件名扩展,下面介绍几种扩展:
大括号扩展
看如下例子:
[root@iZ23kwr96m6Z ~]# echo a{b,c,d}e
abe ace ade
[root@iZ23kwr96m6Z ~]# echo {1..10}
1 2 3 4 5 6 7 8 9 10
[root@iZ23kwr96m6Z ~]# echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@iZ23kwr96m6Z ~]# echo {5..-3}
5 4 3 2 1 0 -1 -2 -3
[root@iZ23kwr96m6Z ~]# echo {g..z}
g h i j k l m n o p q r s t u v w x y z
[root@iZ23kwr96m6Z ~]# echo {1..3} {a..c}
1 2 3 a b c
#注意两个扩展之间有空格和没空格的区别
[root@iZ23kwr96m6Z ~]# echo {1..3}{a..c}
1a 1b 1c 2a 2b 2c 3a 3b 3c
#大括号还可以嵌套,嵌套结果按照顺序展示
[root@iZ23kwr96m6Z ~]# echo a{{b,c,d}a,{e,f,g}b,h}i
abai acai adai aebi afbi agbi ahi
[root@iZ23kwr96m6Z ~]# echo {a,b{1..3},c}
a b1 b2 b3 c
此外bash还提供了一些按照固定步长扩展的功能,格式为{start,end,incre}
[root@iZ23kwr96m6Z ~]# echo {1..9..4}
1 5 9
[root@iZ23kwr96m6Z ~]# echo {1..9..3}
1 4 7
#如果START和end为整数且有0先导时,输出的内容会通过在前面补零达到相同位数
[root@iZ23kwr96m6Z ~]# echo {0001..10..3}
0001 0004 0007 0010
大括号扩展在其他所有扩展之前进行,在其他扩展中的特殊字符都被保留下来。为了避免被认为是大括号拓展的一部分,"{“或者”,“可以用反斜杠转义,为了避免与参数扩展冲突,大括号扩展不会识别字符串中的”${"
波浪号扩展
波浪号前缀~+
会被SHELL变量PWD的值替代~-
会被LODPWD替代
[root@iZ23kwr96m6Z ~]# echo ~+
/root
命令替换
命令替换是指用命令的输出替换命令本身,命令替换有两种形式:$(COMMAND)
或者`COMMAND`
[root@iZ23kwr96m6Z ~]# echo $(pwd)
/root
#注意此处是``倾斜的单括号,类似于前述的将命令的执行结果赋值给变量
[root@iZ23kwr96m6Z ~]# echo 'pwd'
pwd
[root@iZ23kwr96m6Z ~]# echo `pwd`
/root
命令替换可以嵌套,使用反引号形式"``"嵌套时,里面的反引号需要用反斜杠\转义
文件名扩展
如果bash中没有设置-f选项,就会支持文件名拓展。bash支持一下三种通配符来实现文件名拓展:
- * 匹配任何字符串也包括空字符串
- ?匹配任意单个字符
- […]匹配方括号内的任意字符
[root@iZ23kwr96m6Z usr]# ls
a.txt bin b.txt etc games include lib lib64 libexec local logs sbin share src tmp works
[root@iZ23kwr96m6Z usr]# ls *.txt
a.txt b.txt
[root@iZ23kwr96m6Z usr]# ls [ab].txt
a.txt b.txt
[root@iZ23kwr96m6Z usr]# ls [a].txt
a.txt
[root@iZ23kwr96m6Z usr]# ls ?.txt
a.txt b.txt
创建和使用别名
在文件~/.bashrc
中可以为一些命令语句创建别名,一旦修改了这个文件必须重新登录shell才会生效
创建别名通过内置命令alias
,语法如下:alias name=‘command’
- name—用户定义的别名 command—任意linux命令
如下例子:
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
通过命令alias
可以查看所有的别名
[root@iZ23kwr96m6Z ~]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
查看某个特定别名语法为:alias 别名
,当想调用实际命令而暂停使用别名是,需要使用如下方法:\aliasname
,删除一个别名的语法为:unalias 别名
,删除当前环境中所有别名 unalias -a
注意别名请谨慎使用
修改bash提示符
登录shell后,bash前面的提示符[root@iZ23kwr96m6Z ~]#
是可以定制修改的,通过export 变量PS1即可,非重点内容此处不详述了。
常用shell(bash)命令
查看文件和目录
ls/ll
ls
列出当前目录下所有文件和目录,不带详细信息(文件类型,大小,修改日期和时间,权限等)
ls -l
每行显示一条记录,包括文件类型,大小,修改日期和时间,权限等
ls -lh
文件大小显示为更符合人类阅读习惯的格式
ls -a
列出包含隐藏文件或目录,包括"."(当前目录)和"…"(父目录)
ls -A
列出不包括"."(当前目录)和"…"(父目录)的所有文件和目录
ls -i
显示文件或目录的inode编号
ll
命令同ls -l
cd
cd切换目录
cd /usr #切换到usr目录
cd .. #切换到上一层目录
cd / #切换到系统根目录
cd ~ #切换到用户主目录
cd - #切换到上一个所在目
pwd
pwd:显示当前的目录
cat
cat
命令,cat可以查看文件,语法为cat 文件名
,此外利用cat命令可以将两个文件合成一个文件输出:
[root@iZ23kwr96m6Z usr]# ll
total 184
...
-rw-r--r--. 1 root root 6 Jun 22 19:28 a.txt
-rw-r--r--. 1 root root 4 Aug 14 17:02 b.txt
[root@iZ23kwr96m6Z usr]# cat a.txt b.txt >c.txt
[root@iZ23kwr96m6Z usr]# ll
-rw-r--r--. 1 root root 6 Jun 22 19:28 a.txt
-rw-r--r--. 1 root root 4 Aug 14 17:02 b.txt
-rw-r--r--. 1 root root 10 Aug 14 17:02 c.txt
[root@iZ23kwr96m6Z usr]# cat c.txt
shfub
haha
less/more
less、more
命令示例:分屏显示文件
more
命令一次查看一整屏内容,查看文件语法为more 文件
,使用空格可以向下翻页more -num 文件
可以控制一次显示num行;
less
命令向前或者向后翻页都支持,less命令不需要在查看前加载整个文件,查看文件更快速,查看文件语法为less 文件名
当使用less命令打开文件后,可以使用搜索功能,搜索指定关键字,搜索到会高亮关键字:
-
/关键字
回车后,自动跳转到关键字第一次出现的地方,并且高亮所有关键字n,向前跳转到上一个匹配关键字的地方
N,向后跳转到下一个匹配关键字的地方
-
?关键字
回车后,向后搜索关键字n,向后跳转到上一个匹配关键字的地方
N,向前跳转到下一个匹配关键字的地方
使用less命令浏览较大文件时,可以使用如下屏幕导航命令:
Ctrl+F
—向前翻一个窗口的内容
Ctrl+B
—向后翻一个窗口的内容
Ctrl+D
—向前翻半个窗口的内容
Ctrl+U
—向后翻半个窗口的内容
g—跳转到文件的开头;G—跳转到文件的末尾;q或ZZ—退出less
less命令还可以打开多个文件,在多个文件中切换,以及标记某个位置以便后续返回,这里不详述
head/tail
head
命令用于打印前几行,默认打印前10行,可以通过-n指定打印多少行,语法为head -n 5 文件
也可以不使用-n选项,直接head -5 文件名
#打印出除最后五行外所有内容
head -n -5 文件
#打印文件前n个字节的数据
head -c 10 文件
#打印文件除最后n个字节的数据
head -c -10 文件
tail
命令用于显示后几行:
#打印文件的后N行
tail -n 10 文件
#即时打印文件的后n行
tail -f 文件
#在特定进程结束时终结tail命令
tail -f 文件 --pid pidnum
####file
file
命令用于查看文件类型,语法file 文件
#使用-i,可以以MIME类型的格式显示文件类型的信息
file -i 文件
wc
wc
命令用于查看文件的行数、单词数和字符数等信息
wc 文件
#X表示行数 Y表示单词树 Z表示字节数
X Y Z 文件名
此外,使用-l选项,可以值统计文件的行数,-w统计单词数,-c统计字节数,-L统计文件中最长的行的长度
find
find
命令用于查找文件或者目录
find 路径 -name 文件名
find /root -name redis.conf
#在当前目录下查找
find . -name 文件名
#在当前目录下不区分大小写查找文件
find . -iname 文件名
#在当前目录下查找文件类型是目录的文件
find . -type d -name 文件名
#在当前目录下找到所有的sh文件
find . -type f -name *.sh
#在当前目录下找到文件权限是777的文件
find . -type f -perm 777
#在当前目录下找到文件权限不是777的文件
find . -type f ! -perm 777
#在当前目录下找到所有只读文件
find . -type f ! -perm /a+w
#在当前目录下找到所有可执行文件
find . -type f -perm /a+x
#找到当前目录下的.log文件并将其删除
find . -type f -name "*.log" -exec rm -f {} \
#找到当前目录下的所有空目录
find . -type d -empty
#找到当前目录下所有者是root的文件和目录
find . -user root
#找到当前目录下所有者是root的文件和目录
find . -group root
#找出当前目录下,三天前修改过的文件
find . -type f -mtime 3
#找出当前目录下,三天内修改过的文件
find . -type f -mtime -3
#找出当前目录下,三十天以前,六十天以内修改过的文件
find . -type f -mtime +30 -mtime -60
#找出当前目录下,一小时以内变更过的文件
find . -type f -cmin -60
#找出当前目录下,一小时以内访问过的文件
find . -type f -amin -60
#找出当前目录下,大于50MB小于100MB的所有文件
find . -type f -size +50MB -size -100MB
#找出当前目录下,大于100MB的文件并将其删除
find . -type f -size +100MB -exec rm -rf {} \
touch
touch
命令可用于创建文件,语法为touch 文件名
,可以同时创建多个文件touch 文件1 文件2 文件3
,touch命令有如下选项:
- -a:只改变访问时间 -c:不创建任何文件 -m:只改变修改时间 -r:使用指定文件的时间替代当前时间
mkdir
mkdir
:创建新的目录,语法为mkdir 目录名
,使用-p可以递归创建目录(父目录不存在自动创建)mkdir /a/b/c
,使用-m选项,可以设置创建的目录的权限
mkdir -p -m 777 /a/b
mkdir -p -m a=rwx /a/b
rmdir
rmdir #删除一个空的目录
rmdir d #删除目录 注意只能删除空目录
cp
cp
复制文件或目录,语法为cp /路径a/文件a /路径b/文件名
,使用-p选项,可以保留源文件的所有者,用户组,权限,修改和访问时间等信息,使用-R或者-r可以递归复制一个目录
scp
对于通过ssh连接的服务器,复制文件命令,比如登录跳板机将jar包赋值给其他服务器
scp ./*****.jar root@ip:/usr/works/target_***/
mv
mv
命令用于将文件和目录从一个位置移到另一个位置,还可以用于修改文件或目录的名字,语法为mv source target
#将当前目录下的文件source.txt移动到/tmp下
mv ./source.txt /tmp
#将目录dir1,dir2移动到目录/target下
mv dir1 dir2 /target
#将当前文件名更改
mv old.txt new.txt
默认情况下,如果目标文件已经存在,mv命令不会提示,会直接覆盖目标文件,使用-i可以让mv命令重写或覆盖目标文件之前给出提示
使用mv可以同时移动多个文件或目录
#将当前目录下的所有文件移动到目录/tmp下
mv * /tmp
如果只想将源目录中有而目标目录中没有的文件,可以使用-u选项
#将dir1中有而dir2中没有的文件移动到dir2
mv -u dir1/* dir2/
ln
ln
建立软连接或硬连接的命令
rm
rm
删除文件或目录
#同时删除多个文件
rm file1 file2 file3
#使用-i 可以在删除前提示用户确认
rm -i 文件名
#删除后缀为.doc的文件
rm *.doc
#删除当前目录下所有文件名包含"movie"字符串的文件
rm *movie*
?号用于匹配一个字符
#删除当前目录下整个文件名(包含扩展名)只有三个字符的所有文件
rm ???
#删除当前目录下文件拓展名有两个字符的所有文件
rm *.??
[]用于匹配包含括号内任意一个字符
#删除当前目录下文件名中含有字母a,b,或c的文件
rm * [abc]*
#删除当前目录下文件拓展名是字母c或h的所有文件
rm *.[ch]y
管理文件或目录权限
当我们使用ls -l或ll命令时,如下:
[root@iZ23kwr96m6Z ~]# ls -l
total 1369044
-rw-r--r--. 1 root root 66156 Jun 11 17:07 10596.txt
-rw-r--r--. 1 root root 94831 Jun 27 2018 84.txt
drwxr-xr-x. 9 root root 4096 Jan 18 2019 apache-tomcat-7.0.73
drwxr-xr-x. 3 root root 4096 Nov 21 2016 data
上面输出的第一列的第一个字符表示文件类型(d目录-文件l链接)2-10九个字符(如第一行rw-r–r--)表示三种用户类型的权限,具体如下:
从左至右用1-10这些数字来表示:
1、确定文件类型
当为[ d ]则是目录
当为[ - ]则是文件;
若是[ l ]则表示为链接文档(link file);
若是[ b ]则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
若是[ c ]则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)
2、确定属主(该文件的所有者)拥有该文件的权限
[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute),要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已
3、确定属组(所有者的同组用户)拥有该文件的权限
4、确定其他用户拥有该文件的权限
其中,第1、4、7位表示读权限,如果用"r"字符表示,则有读权限,如果用"-"字符表示,则没有读权限;
第2、5、8位表示写权限,如果用"w"字符表示,则有写权限,如果用"-"字符表示没有写权限;第3、6、9位表示可执行权限,如果用"x"字符表示,则有执行权限,如果用"-"字符表示,则没有执行权限。
5、链接数
6、文件所有者
7、文件所属组
8、文件字节大小
9、文件最后修改日期
10、文件名
chmod
chmod
命令用于修改权限,语法可以采用符号表达式,也可以用八进制位模式
使用符号表达式格式如下:
chmod [option]…[ugoa][[±=][rwxug]][,…] FILE…
其中字母ugoa用于控制那些用户对文件的访问权限将被改变
- u:指文件或目录的所有者
- g:指文件或目录的用户组的成员
- o:指不在文件或目录的用户组中的其他用户
- a:指所有用户,即(ugo)
当使用符号表达式,不给出ugoa组合时,相当于使用a
操作符"±=表示权限的授予或撤销"
- +:选定的权限将被添加
- -:选定的权限将被移除
- =:文件只拥有选定的权限
#移除用户组成员的写权限
chmod g-w 文件名
#赋予其他用户执行文件的权限
chmod o+x 文件名
#只给文件的所有者写权限
chmod u=w 文件名
#用文件的用户组权限替换文件的所有者权限
chmod u=g 文件名
#赋予所有人对文件读、写和执行的权限
chmod ugo+rwx 文件名
chmod命令的数字模式是用数字来表示读(4),写(2)和执行(1)的权限,每个用户权限组的值就是这三者组合相加得到的八进制数(0-7),如下:
- 4:r(读权限)
- 2:w(写权限)
- 1:x(执行权限)
- 表示rwx权限就是4+2+1=7,rw-权限就是4+2+0=6,r–权限就是4+0+0=4,r-x权限就是4+0+1=5
#赋予所有人对文件读、写和执行的权限
chmod 777 文件名
#赋予文件的所有者和用户组成员读写权限,其他用户只读权限
chmod 664 文件名
#使用-R选项,可以递归修改文件的目录权限
chmod -R 775 目录
#如果只想修改当前目录下所有智目录的权限,而不修改文件的权限,可以将chmod与find相结合
find . -type d -exec chmod -R 775 {} \;
vi/vim
vi&vim
:
vi: 创建文件或编辑文件
vi a.txt 创建文件a.txt并进入文档,按下a或者i或者o进入编辑模式,内容写完之后,按下esc键,然后输入命令:
:wq 保存并退出
注意必须要使用:
在Linux下一般使用vi编辑器来编辑文件。vi既可以查看文件也可以编辑文件。
三种模式:命令行、插入、底行模式。切换到命令行模式:按Esc键;
切换到插入模式:按 i 、o、a键;
i 在当前位置生前插入
I 在当前行首插入
a 在当前位置后插入
A 在当前行尾插入
o 在当前行之后插入一行
O 在当前行之前插入一行
chown/chgrp
chown/chgrp
修改文件所有者和用户组
其他shell命令
grep
grep:查找符合条件的字符串。用法: grep [选项]... PATTERN [FILE]..
命令:
grep str b.txt 在文件中查找str
grep str b.txt –color 高亮显示
tar
tar
tar命令位于/bin目录下,它能够将用户所指定的文件或目录打包成一个文件,但不做压缩
一般Linux上常用的压缩方式是选用tar将许多文件打包成一个文件,再以gzip压缩命令压缩成xxx.tar.gz(或称为xxx.tgz)的文件
格式:tar [参数] 文件
常用参数:
-c:创建一个新tar文件
-v:显示运行过程的信息
-f:指定文件名
-z:调用gzip压缩命令进行压缩
-t:查看压缩文件的内容
-x:解开tar文件
命令:
tar -cvf test1.tar ./* 将当前目录下的所有文件打包为test1.tar
tar -cvf test2.tar b.txt 将指定文件打包到test2.tar
tar -zcvf test3.tar.gz ./* 将当前目录下的所有文件打包并且压缩到test3.tar.gz
tar -xvf test1.tar 解压到当前目录
tar -xvf test3.tar.gz -C aaa 将文件解压到 aaa目录
df
df
用于显示文件系统的可用磁盘空间的数量
df列出文件系统的整体磁盘使用量
df命令参数功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。
格式:df [参数] [目录或文件名]
常用参数:
-a :列出所有的文件系统,包括系统特有的 /proc 等文件系统;
-k :以 KBytes 的容量显示各文件系统;
-m :以 MBytes 的容量显示各文件系统;
-h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
-H :以 M=1000K 取代 M=1024K 的进位方式;
-T :显示文件系统类型, 连同该 partition 的 filesystem 名称 (例如 ext3) 也列出;
-i :不用硬盘容量,而以 inode 的数量来显示
命令:
df -h 将容量结果以易读的容量格式显示出来
df -aT 将系统内的所有特殊文件格式及名称都列出来
du
du
:评估文件空间利用率
du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看
格式:du [参数] 文件或目录名称
常用参数:
-a :列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已。
-h :以人们较易读的容量格式 (G/M) 显示;
-s :列出总量而已,而不列出每个各别的目录占用容量;
-S :不包括子目录下的总计,与 -s 有点差别。
-k :以 KBytes 列出容量显示;
-m :以 MBytes 列出容量显示;
命令:
du -a 将文件的容量也列出来
du -sm /* 检查根目录底下每个目录所占用的容量
fdisk
fdisk 是 Linux 的磁盘分区表操作工具
格式:fdisk [参数] 装置名称
常用参数:
-l :输出后面接的装置所有的分区内容。若仅有 fdisk -l 时, 则系统将会把整个系统内能够搜寻到的装置的分区均列出来
命令:
fdisk -l 列出所有分区信息
ps
ps 显示进程
命令:
ps -ef 显示所有进程
ps -ef | grep ssh 在所有的进程中搜索和ssh相关的
kill
kill 杀掉某个进程,后面跟着进程的id
命令:
kill 1234
kill -9 1234强制干掉1234
管道
将一个命令的输出结果作为另外一个命令的输入
ps 显示进程
ps -ef显示所有进程
ps -ef | grep ssh 在所有的进程中搜索和ssh相关的
防火墙
service iptables status 查看防火墙状态
service iptables start 启动防火墙
service iptables stop 关闭防火墙
service iptables restart 重启
chkconfig iptables off 永久关闭防火墙
chkconfig iptables on 永久关闭后重启
关机
shutdown -r now 立刻重启
shutdown -r 10 过10分钟自动重启
shutdown -r 20:35 在时间为20:35时候重启
shutdown -c 取消重启
poweroff 立刻关机
shutdown -h now 立刻关机
shutdown -h 10 10分钟后自动关机
网络
ifconfig 查看网络ip地址
ping ip地址 查看是否可以连接某个ip
后台执行命令
crontab
cron是执行定时任务的守护进程,在系统处于多用户运行级别时,cron进程会从/etc/init.d中自动启动,进程会在目录/var/spool/cron/crontabs下搜索定时计划任务文件(文件名为创建此任务的账户名),并将找到的定时计划任务载入内存
/var/spool/cron/crontabs中的定时任务文件不要直接用编译器编辑,使用crontab
命令可以检查语法错误。cron进程还会读取/etc/crontab以及/etc/cron.d下的内容。
crontab
命令用于创建、修改、删除和查看定时任务。定时任务文件由每行命令组成,每行6个字段,由空格或者制表符分隔,前五个字段表示任务运行的时间,在最后一个字段是任务的命令。
如下:
01 * * * * root run-parts /etc/cron.hourly
前五个字段含义依次如下:
- 分钟,0-59
- 小时,0-23
- 日期,1-31
- 月份,1-12或Jan-Dec
- 星期,0-6或Sun-Sat,0表示星期日
前五个字段还可以使用如下字符
- 星号(*) 匹配所有可能的值,比如"0 6 * * *"表示每天6点
- 连字符(-)定义一个范围,比如"0 2 * * 1-5"表示每周一到周五的凌晨两点
- 斜杠(/)表示每间隔多少时间,比如"*/5 * * * *"表示每5分钟
- 逗号(,)表示或的含义,比如"0 0,6,12,18 * * *"表示每天的0点、6点、12点和18点
#使用-l选项,可以列出当前用户的所有定时计划任务
crontab -l
#使用-e选项,可以创建或修改当前用户的定时计划任务
crontab -e
#使用-u选项,可以查看指定用户的定时计划任务
crontab -u root -l
#使用-r选项,将没有确认信息直接删除当前用户的定时计划任务
crontab -r
#将-i和-r结合在移除前可以提示用户确认
crontab -l
00 00 * * * /bin/bash /usr/local/nginx/sbin/cut_nginx_log.sh
crontab -i -r
crontab: really delete root's crontab?
at
at
命令用于安排一个任务在指定的时间运行。at命令可以从标准输入读入命令,也可以从指定的文件中读入,然后在指定的时间运行这些命令。语法如下:
at -f file -q queue option time date
at命令支持比较复杂的时间和日期,使用-f选项,可以从指定的文件中读取命令内容,然后在指定时间运行。如下示例:
at -f myjob.txt now +1 minutes
#列出当前用户
at -l所有已创建但未执行或正在运行的任务
#atq命令功能同at -l
#atrm命令可以删除现有的任务,其中1是任务的编号,使用at -l之后可以展示出来
atrm 1
&
&
代表将任务放在后台运行
该命令是bash内置的用于并行处理进程的一个控制操作符,在命令行的末尾添加&
将会在后台运行该命令,将在当前的shell进程下启动一个子进程
echo haha &
[1] 9533
haha
其中[1]是这个后台任务的编号,9533为其对应的子进程号。
使用jobs
命令可以显示后台运行的进程号,运行状态等信息
jobs
[1]+ Done echo hah
如果需要将后台任务放到前台执行,使用如下命令,其中job-id为任务编号
%job-id
或fg job-id
如果想将任务重新再放回后台执行,首先按Ctrl+Z,将上述放在前台的任务挂起,然后输入%job-id &或bg
,其中bg用于将挂起的任务放在后台继续运行。
nohup
nohup
命令:
运行一个对挂起免疫的命令,使用该命令能让你运行的命令或脚本在你退出系统后继续在后台运行
#运行一个jar包
nohup java -jar xxx.jar &
#运行一个脚本
nohup sh xxx.sh &
[1] 12496
nohup: appending output to 'nohup.out'
上面例子中[1]为任务编号,12496是该后台任务的进程号,后面一句表示该脚本运行的所有输出内容被写入到当前目录下的nohup.out中
sort
命令可以对文本进行排序,uniq
命令可以文本去重,tr
命令替换或删除字符,diff
比较两个文件,pwd
:显示目前的目录,hostname
:显示当前主机名,使用hostname 新主机名
可以修改主机名(只在当前有效,系统重启后不再生效)
uptime
10:08:20 up 62 days, 16:43, 1 user, load average: 0.01, 0.04, 0.05
#uptime 用于打印系统运行信息,10:08:20表示当前时间,后面表示已运行62天,16小时,43分,当前登录用户一位,load average分别显示过去1分钟,5分钟和15分钟的平均负载
用户管理
Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。
用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护。
每个用户账号都拥有一个惟一的用户名和各自的口令。
用户在登录时键入正确的用户名和口令后,就能够进入系统和自己的主目录。
实现用户账号的管理,要完成的工作主要有如下几个方面:
用户账号的添加、删除与修改。
用户口令的管理。
用户组的管理。
useradd
useradd新增用户
格式:useradd [参数] 用户名称
常用参数:
-c comment 指定一段注释性描述。
-d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。
-g 用户组 指定用户所属的用户组。
-G 用户组,用户组 指定用户所属的附加组。
-s Shell文件 指定用户的登录Shell。
-u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。
命令
useradd stu 新增用户stu
passwd
passwd给指定的用户设置密码
用户管理的一项重要内容是用户口令的管理。用户账号刚创建时没有口令,但是被系统锁定,无法使用,必须为其指定口令后才可以使用,即使是指定空口令。指定和修改用户口令的Shell命令是passwd。超级用户可以为自己和其他用户指定口令,普通用户只能用它修改自己的口令
格式:passwd [参数] 用户名
常用参数:
-l 锁定口令,即禁用账号。
-u 口令解锁。
-d 使账号无口令。
-f 强迫用户下次登录时修改口令。
如果默认用户名,则修改当前用户的口令,比如centOS 默认的root账号没有密码,就可以直接使用passwd修改密码即可。
命令:
passwd stu 按下enter键 输入2次密码即可
userdel
userdel删除用户
命令:
userdel stu 删除指定用户但是用户在home下面的目录保存
userdel -r stu 删除指定用户并且删除对应的home目录
usermod
usermod修改用户信息
格式:usermod [参数]
常用的参数包括-c, -d, -m, -g, -G, -s, -u以及-o等,这些选项的意义与useradd命令中的选项一样,可以为用户指定新的资源值。
另外,有些系统可以使用选项:-l 新用户名,这个选项指定一个新的账号,即将原来的用户名改为新的用户名。
命令:
usermod stu -l stu2 将用户名stu重命名为stu2
用户组管理
每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。
用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对/etc/group文件的更新
groupadd
groupadd增加一个新的用户组
格式:groupadd [参数] 用户组名称
常用参数:
-g GID 指定新用户组的组标识号(GID)。
-o 一般与-g选项同时使用,表示新用户组的GID可以与系统已有用户组的GID相同
命令:
groupadd gp1 新增用户组gp1
groupadd -g 1111 gp2 新增用户组gp2,并且组标记号为1111
groupdel
groupdel删除一个用户组
格式:groupdel 用户组名称
命令:
groupdel gp1 删除用户组gp1
groupmod
groupmod修改用户组信息
格式:groupmod [参数] 用户组名称
常用参数:
-g GID 为用户组指定新的组标识号。
-o 与-g选项同时使用,用户组的新GID可以与系统已有用户组的GID相同。
-n 新用户组 将用户组的名字改为新名字
命令:
groupmod gp2 -n gp5 让gp2更名为gp5
newgrp
newgrp切换到其他用户组
格式:newgrp 用户组名称
命令:
new grp gp5 切换到gp5
附图
最后附一张我关注的一个博主java3y
之前总结的脑图,我转成图片放在此处,比较简洁清晰,如有侵权,联系删除: