1、~/.bash_history 记录的是前一次登录以前所执行过的命令
2、type可以查询命令是否为bash shell的内置命令
语法:
type [-tpa] name
:不加任何参数,type会显示出name是外部命令还是内置命令
-t:显示出它的意义
file:表示为外部命令
alias:表示该命令我命令别名所设置的名称
builtin:表示该命令为bash内置的命令功能
-p:如果为外部命令时,才会显示完整文件名
-a:会由path变量定义的路径中,将所有含有name的命令都列出来,包含alias
例如:
#bash内置命令
[root@vidar-ali ~]# type cd
cd is a shell builtin
[root@vidar-ali ~]# type -t cd
builtin
[root@vidar-ali ~]# type -p cd
[root@vidar-ali ~]# type -a cd
cd is a shell builtin
cd is /usr/bin/cd
#命令别名
[root@vidar-ali ~]# type ls
ls is aliased to `ls --color=auto'
[root@vidar-ali ~]# type -t ls
alias
[root@vidar-ali ~]# type -p ls
[root@vidar-ali ~]# type -a ls
ls is aliased to `ls --color=auto'
ls is /usr/bin/ls
#外部命令
[root@vidar-ali ~]# type yum
yum is hashed (/usr/bin/yum)
[root@vidar-ali ~]# type -t yum
file
[root@vidar-ali ~]# type -p yum
/usr/bin/yum
[root@vidar-ali ~]# type -a yum
yum is /usr/bin/yum
3、命令行快速编辑
ctrl+u ——从光标处向前删除命令串(不包含光标内容)
ctrl+k ——从光标后先后删除命令串(包含光标内容)
ctrl+a ——移动光标到命令行最前面
ctrl+e ——移动光标到命令行最后面
4、若shell变量为扩增变量内容时,则可用"$变量名称" 或 ${变量} 累加内容,如:
PATH="PATH":/home/bin 或 PATH=${PATH}:/home/bin
5、子进程:
在当前shell的情况下,去启用另一个新的shell,新的shell就是子进程。一般来说,父进程的自定义变量无法在子进程内使用,通过export将变量变成环境变量后,就能够使用。unset name 取消变量名的设置。
6、PS1命令设置提示字符
\d :代表日期,格式为weekday month date,例如:“Mon Aug1”
\H:完整的主机名称。例如:我的机器名称为:fc4.linux,则这个名称就是fc4.linux
\h :仅取主机的第一个名字,如上例,则为fc4,.linux则被省略
\t :显示时间为24小时格式,如:HH:MM:SS
\T :显示时间为12小时格式
\A :显示时间为24小时格式:HH:MM
\u :当前用户的账号名称
\v :BASH的版本信息
\w :完整的工作目录名称。家目录会以 ~代替
\W :利用basename取得工作目录名称,所以只会列出最后一个目录
# :下达的第几个命令
$ :提示字符,如果是root时,提示符为:# ,普通用户则为:$
例如:
[root@vidar-ali ~]# PS1='[\u@\h \w \A \#]\$'
[root@vidar-ali ~ 19:39 56]#
7、locale 查询语系变量,cat /etc/locale.conf 可以设置系统整体的默认语系
8、read [-pt] variable(变量键盘读取)
-p:后面可以接提示字符
-t:后面可以接等待的秒数
例如:
[root@vidar-ali ~]# read -p "请输入自己的名字:" -t 10 named
请输入自己的名字:zhang
[root@vidar-ali ~]# echo $named
zhang
9、declare [-aixr] variable 声明变量的类型
-a:指定变量为数组类型
-i:指定变量为整数类型
-x:指定变量为环境变量
-r:将变量设置为制度类型,不可更改,也不能unset
例如:
[root@vidar-ali ~]# sum=100+200+300
[root@vidar-ali ~]# echo $sum
100+200+300
[root@vidar-ali ~]# declare -i sum=100+200+300
[root@vidar-ali ~]# echo $sum
600
如果不小心将变量设置为【只读】,通常要注销再登录才能恢复该变量的类型。
#将sum设置为环境变量
[root@vidar-ali ~]# declare -x sum
[root@vidar-ali ~]# export | grep sum
declare -ix sum="600"
#把sum设置为只读属性
[root@vidar-ali ~]# declare -r sum
[root@vidar-ali ~]# sum=100
-bash: sum: readonly variable
#把sum变为非环境变量
[root@vidar-ali ~]# declare +x sum
[root@vidar-ali ~]# declare -p sum
declare -ir sum="600"
10、如果想要让用户建立的文件不要太大时,我们是可以考虑ulimit来限制用户可以建立的文件大小,使用ulimit -f就可以来设置。
11、历史命令:history
选项与参数:
n:数字,意思是要列出最近的n条命令行表的意思
-c:将目前的shell中所有history内容全部清除
-a:将目前新增的history命令正如histflies中,若没有,默认写入~/. bash_history
-r:将histfiles的内容读到目前这个shell的history中
-w:将目前的history记录内容写入histfiles中
11、历史命令的特殊用法:
!number ——执行第几条命令的意思
!command ——由最近的命令向前查找的那个命令,并执行(command为命令的开头关键字)
!! ——执行上一个命令
12、最后注销的bash才会最后写入history的数据
13、路径与命令查找工具
①以相对/绝对路径执行命令,例如:【/bin/ls】或【./sh】
②由alias找到该命令来执行
③由bash内置的(builtin)命令来执行
④通过$PATH这个变量的顺序查找到的第一个命令来执行
(通过type -a [命令] 可以查询到顺序)
14、cat /etc/issue 设置bash的登录信息
\d ——本地端时间的日期
\l ——显示第几个终端
\m ——显示硬件的等级(i386等)
\n ——显示主机的网络名称
\O ——显示domain name
\r ——操作系统版本
\t ——显示本地端时间的时间
\S ——操作系统的名称
\v ——操作系统的版本
15、 cat /etc/motd 设置bash的欢迎信息
例如:
[root@vidar-ali ~]# cat /etc/motd
Welcome to Alibaba Cloud Elastic Compute Service !
16、login shell需要输入账号和密码,non-login shell不需要输入密码(子进程)
17、login shell 只会读取/etc/profile 和 ~/.bash_profile (或 ~/.bash_login 或 ~/.profile)
profile文件:
[root@vidar-ali ~]# cat /etc/profile
# /etc/profile
# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc
# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.
pathmunge () {
case ":${PATH}:" in
*:"$1":*)
;;
*)
if [ "$2" = "after" ] ; then
PATH=$PATH:$1
else
PATH=$1:$PATH
fi
esac
}
if [ -x /usr/bin/id ]; then
if [ -z "$EUID" ]; then
# ksh workaround
EUID=`/usr/bin/id -u`
UID=`/usr/bin/id -ru`
fi
USER="`/usr/bin/id -un`"
LOGNAME=$USER
MAIL="/var/spool/mail/$USER"
fi
# Path manipulation
if [ "$EUID" = "0" ]; then
pathmunge /usr/sbin
pathmunge /usr/local/sbin
else
pathmunge /usr/local/sbin after
pathmunge /usr/sbin after
fi
HOSTNAME=`/usr/bin/hostname 2>/dev/null`
HISTSIZE=1000
if [ "$HISTCONTROL" = "ignorespace" ] ; then
export HISTCONTROL=ignoreboth
else
export HISTCONTROL=ignoredups
fi
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
# By default, we want umask to get set. This sets it for login shell
# Current threshold for system reserved uid/gids is 200
# You could check uidgid reservation validity in
# /usr/share/doc/setup-*/uidgid file
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
umask 002
else
umask 022
fi
for i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; do
if [ -r "$i" ]; then
if [ "${-#*i}" != "$-" ]; then
. "$i"
else
. "$i" >/dev/null
fi
fi
done
unset i
unset -f pathmunge
bash_profile文件:
[root@vidar-ali ~]# cat .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
18、最终被读取的文件为【~/.bashrc】
19、source读入环境配置文件的命令,不用注销登录就可以加载
20、如果出现【-bash-4.2$】这个情况,说明没调用/etc/bashrc来规范PS1变量,可以复制/etc/skel/.bashrc到家目录,然后自定义内容后,用source加载
21、终端环境配置stty
[root@vidar-ali ~]# stty -a
speed 38400 baud; rows 28; columns 74; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = ;
eol2 = ; swtch = ; start = ^Q; stop = ^S; susp = ^Z;
rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
#几个重要关键词的意义:
intr:发送一个interrupt(中断)信号给目前正在运行的程序,就是终止程序运行ctrl+C
quit:发送一个quit信号给目前正在run的程序ctrl+\
erase:向后删除字符串ctrl+?
kill:删除在当前光标前的所有文字ctrl+U
eof:End of file的意思,代表结束输入。例如邮件结束的时候ctrl+D
stop:将目前程序停止运行,不能进行任何操作。例如:我们在vim时,按下ctrl+s此时终端就会卡住,不能就行任何操作。可以使用使用start重新启动ctrl+S
start:在某个程序停止(stop)后,重新启动它的output。ctrl+Q
22、终端环境设置set
作用:不用任何参数时,查看当前的环境变量,设置命令行输入/输出的环境
set [参数]
参数选项:
-u:默认不启用,若启用后,当使用未设置的变量时,会显示错误信息
-v:默认不启用,若启用后,在信息被输出前,会先显示信息的原始内容
-x:默认不启用,若启用后,在命令被执行前,会显示命令内容(前面有++号)
-h:默认启用,与历史命令有关
-H:默认启用,与历史命令有关
-m:默认启用,与任务管理有关
-B:默认启用,与中括号[ ]的作用有关
-C:默认不启用,若使用>等,则若文件存在时,该文件不会被覆盖
23、bash默认组合键汇整
ctrl+C 终止目前的命令
ctrl+D 输入结束(EOF),例如邮件结束的时候
ctrl+M 就是回车
ctrl+S 暂停屏幕
ctrl+Q 恢复屏幕
ctrl+U 在提示符下,将整列命令删除
ctrl+Z 暂停目前的命令
24、通配符与特殊符号
通配符:
符号 | 意义 |
---|---|
/* | 代表『 0 个到无穷多个』任意字符 |
? | 代表『一定有一个』任意字符 |
[ ] | 同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』 |
[ - ] | 若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表 0 到 9 之间的所有数字,因为数字的语系编码是连续的! |
[^ ] | 若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个字符,只要是非 a, b, c 的其他字符就接受的意思。 |
特殊符号:
符号 | 内容 |
---|---|
# | 批注符号:这个最常被使用在 script 当中,视为说明!在后的数据均不运行 |
\ | 跳脱符号:将『特殊字符或通配符』还原成一般字符 |
; | 连续命令下达分隔符:连续性命令的界定 (注意!与管线命令并不相同) |
~ | 用户的家目录 |
$ | 取用变量前导符:亦即是变量之前需要加的变量取代值 |
& | 工作控制 (job control):将命令变成背景下工作 |
! | 逻辑运算意义上的『非』 not 的意思! |
/ | 目录符号:路径分隔的符号 |
>, >> | 数据流重导向:输出导向,分别是『取代』与『累加』 |
<, << | 数据流重导向:输入导向 (这两个留待下节介绍) |
’ ’ | 单引号,不具有变量置换的功能 |
" " | 具有变量置换的功能! |
` ` | 两个『 ` 』中间为可以先运行的命令,亦可使用 $( ) |
( ) | 在中间为子 shell 的起始与结束 |
{ } | 在中间为命令区块的组合! |
25、EOF写法
cat << EOF >> 文件名(追加)
...内容...
EOF
cat << EOF > 文件名(覆盖)
...内容...
EOF
26、判断式通常写法
command1 && command2 || command3
27、选取命令:cut
cut命令可以将一段信息的某一段选取出来,信息处理一行为单位。CUT命令使用格式如下:
[root@vidarz ~]# cut -d'分隔字符' -f fields <==用于有特定分隔字符
[root@vidarz ~]# cut -c 字符区间 <==用于排列整齐的信息
选项与参数:
-d :后面接分隔字符。与 -f 一起使用;
-f :依据 -d 的分隔字符将一段信息分割成为数段,用 -f 取出第几段的意思;
-c :以字符 (characters) 的单位取出固定字符区间;
例如:
[root@vidar-ali ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@vidar-ali ~]# echo $PATH | cut -d ':' -f 2,4
/usr/local/bin:/usr/bin
注意:last | cut -d ’ ’ -f 3 命令无法达到预期效果,因为相隔不止一个空格。
28、选取命令:grep
cut是将一行信息当中,取出某部分我们想要的,而grep则是分析一行信息, 若当中有我们所需要的信息,就将该行拿出来。其使用方法如下:
[root@vidarz ~]# grep [-acinv] [--color=auto] '查找字符' filename
选项与参数:
-a :将 binary 文件以 text 文件的方式搜寻数据
-c :计算找到 ‘搜寻字符串’ 的次数
-i :忽略大小写的不同,所以大小写视为相同
-n :顺便输出行号
-v :反向选择,亦即显示出没有 ‘搜寻字符串’ 内容的那一行!
–color=auto :可以将找到的关键词部分加上颜色的显示!
例如:
[root@vidar-ali ~]# last | grep 'root'
root pts/1 218.75.36.170 Thu Jul 4 11:10 still logged in
root pts/0 218.75.36.170 Thu Jul 4 09:17 still logged in
root pts/0 218.75.36.170 Thu Jul 4 09:07 - 09:16 (00:09)
root pts/0 218.75.36.170 Wed Jul 3 09:13 - 21:12 (11:59)
root pts/0 218.75.36.170 Mon Jul 1 16:11 - 19:46 (03:34)
root pts/0 218.75.36.170 Thu Jun 27 16:37 - 19:04 (02:26)
[root@vidar-ali ~]# last | grep 'root' | cut -d ' ' -f 1
root
root
root
root
root
root
[root@vidar-ali ~]# last | grep -v 'root'
reboot system boot 3.10.0-957.21.3. Thu Jun 27 23:07 - 16:42 (6+17:34)
29、排序命令:sort、wc、uniq
①sort可以帮我们对输出数据进行排序,并且可以依据不同的数据类型来排序。
sort [-fbMnrtuk] [file or stdin]
选项与参数:
-f 忽略大小写差异,例如A和a视为相同
-b 忽略最前面的空格符部分
-M 以月份的名字来排序,如JAN,DEC等的排序方法
-n 使用“纯数字”进行排序(默认按文字类型排序的)
-r 反向排序
-u uniq,相同的数据,仅仅出现一行
-t 分隔符,默认用[Tab]键来分割
-k 以哪个区间(field)来进行排序
例子:
cat filename | sort #默认对第一个数据进行排序,并且默认以文字类型排序
cat filename | sort -t ':' -k 3 #以:分割内容,以第三列的数据进行排序
②排序后,重复的数据只想看到一个,用uniq。
uniq [-ic]
-i 忽略大小写
-c 进行计数
例如:
[root@vidar-ali ~]# last | awk '{print $3}'
218.75.36.170
218.75.36.170
218.75.36.170
218.75.36.170
218.75.36.170
218.75.36.170
boot
Wed
[root@vidar-ali ~]# last | awk '{print $3}' | uniq -c
6 218.75.36.170
1 boot
1
1 Wed
③WC命令用于统计文件多少行、多少字、字符数
wc [-lwm]
参数:
-l 仅列出行
-w 仅列出多少字(英文单字)
-c 仅列出多少字符
例子:
wc testfile testfile_1 testfile_2 #统计三个文件的信息,依次列出行数、字数、字符数
30、双向重定向:tee
tee会同时将数据流分送到文件与屏幕(Screen),而输出到屏幕的,其实就是stdout。
参数:
-a:以累加方式将数据加入到file中(默认是覆盖)
31、字符转换命令
①tr可以删除一段信息的的文字或者进行文字的替换
tr [-ds] SET1
参数:
-d:删除信息当中的SET1这个字符
-s:替换掉重复的字符
②col可以将tab键转换为空格键
参数:
-x:将tab将转换成对等的空格键
③join可以将两个文件中有相同数据的一行加在一起
join [-til2] file1 file2
参数:
-t:join默认以空格字符分隔数据,并且对比【第一栏位】的数据,如果两个文件相同,则将两条数据连成一行,且第一栏位放在第一个
-i:忽略大小写
-1:以第一栏位来分析
-2:以第二栏位来分析
④paste将文件两行贴在一起,以tab分隔
参数:
-d:后面可以接分隔字符,默认为tab
32、划分命令:split
split可以把一个大文件依据文件大小或者行数来划分。
split [-bl] file PREFIX
参数:
-b:可接欲划分文件的大小
-l:以行数来进行划分
PREFIX:前缀字符
注意:如何把小文件合成一个文件
例如:
cat services* >>servicesback
33、参数代换:xargs
之所以使用xargs,是因为很多命令其实并不支持管道命令,因此我们可以通过xargs来提供该命令使用标准输入。
用法:
xargs [-0epnd] command
参数:
-0: 如果输入的stdin含有特殊字符,例如`, , 空格键等字符时,这个参数可以将它还原成一般字符。这个参数可以用于特殊状态。
-e:这个是EOF(end of file)的意思。后面可以接一个字符串,当xargs分析到这个字符串时,就会停止工作。(不要有空格)
-p:在执行每个命令的参数时,都会询问用户。
-n:后面接次数,每次command命令执行时,要使用几个参数。
-d:使用自己的定义的定界符来分隔参数。
-I:大写i,将xargs的每项名称,一般是一行一行赋值给{},可以{}代替。使用-i的时候,命令以循环的方式执行。如果有3个参数,那么命令就会连同{}一起被执行3次。在每一次执行中{}都会被替换为相应的参数。
例如:
将所有的/etc/passwd内的账号都以id查看,但查到sync就结束命令串
[root@vidar-ali ~]# cut -d ':' -f 1 /etc/passwd | xargs -e'mail' -n 1 id
uid=0(root) gid=0(root) groups=0(root)
uid=1(bin) gid=1(bin) groups=1(bin)
uid=2(daemon) gid=2(daemon) groups=2(daemon)
uid=3(adm) gid=4(adm) groups=4(adm)
uid=4(lp) gid=7(lp) groups=7(lp)
uid=5(sync) gid=0(root) groups=0(root)
uid=6(shutdown) gid=0(root) groups=0(root)
uid=7(halt) gid=0(root) groups=0(root)
34、关于减号【-】的用途
一般来说,如果需要用到stdout或者stdin时,当偏偏又没有文件,可以使用 - 号代替
参考博客:
https://blog.csdn.net/qq_41453285/article/details/88043991
https://www.cnblogs.com/ggjucheng/archive/2012/10/30/2746963.html
https://www.cnblogs.com/wxgblogs/p/6876189.html
https://blog.csdn.net/weixin_39731083/article/details/82226595
https://blog.csdn.net/miouqi/article/details/73350797