Linux——bash的基础特性与命令
bash的基础特性与命令
一、命令
- 历史命令
history
作用:管理命令历史——默认新记录只记录在缓存中,该缓存命令会在用户退出时追加记录在缓存历史文件中
# history -a 追加本次登录缓存中命令至缓存历史文件中
# history -d 删除历史文件中指定的命令——指定历史命令列表编号
# history -c 清空命令历史
快捷操作
#!n调用命令列表中的第n条命令
#!string 调用命令列表中最近一个以string开头的命令
#!!重复运行上一条命令
环境变量$HISTSIZE:命令历史记录的条数
环境变量$HISTFILE:/root/.bash_history
环境变量$HISTFILESIZE:命令历史文件记录历史的条数
调用上一条命令的最后一个参数:
!$ 或者Esc后.
控制命令历史的记录方式——环境变量:HISTCONTROL
ignoredups:忽略重复命令(连续且相同的)
ignorespace:忽略以空白字符(空格)开头的命令
ignoreboth:以上两种同时生效
修改环境变量
#export 变量名=“值” (不加$)
变量赋值:把赋值符号后面的数据存储于变量名指向的内存空间
手动赋值只针对当前shell有效。
所以,如果你不小心删除了公司的数据库, 先#history -c,然后一脸无辜
- 命令补全
略
- 路径补全
略
- 目录管理类命令
cd,pwd,ls,mkdir,rmdir,tree
新建目录
#mkdir /a/b/c/d 在/a/b/c下创建d,首先路径要存在。
# mkdir -p /a/b/c/d 已存在不报错,且自动创建a,b,c,d子目录
# mkdir -pv /a/b/c/d 显示创建过程信息
# mkdir -m MODE 创建目录时直接指定权限
删除目录
#rmdir /a/b/c/d 删除在/a/b/c的d目录,d目录必须为空目录
#rmdir -p /a/b/c/d 递归删除空目录
列出目录层级
tree
重新装一下
#tree /tmp/test1
#tree -d /tmp/test1 只显示目录
#tree -L 2 /tmp level最多显示到2级目录
#tree pattern 只显示由指定pattern匹配到的路径
- 命令行展开
{ }:可承载一个以逗号分隔的列表,并将其展开为多个路径
#mkdir -p /tmp/{a,b}在tmp下创建a和b
- 命令执行结果状态
成功
失败
bash使用特殊变量$?保存最近一次命令的执行状态结果:
0:成功
1-255:失败
程序执行有两类结果,一类为程序的返回值,一类为程序执行的状态结果。
- 文本文件查看类命令
cat,tac,more.less,tail,head
#more [OPTION...] FILE...
#less [OPTION...] FILE... 同man
#head [OPTION...] FILE... 显示前n行,默认10行。
-c字节 -n行数
#tail [OPTION...] FILE... 显示后n行,默认10行。
-c字节 -n行数
-f,--follow 查看到文件尾部后不退出,跟踪显示文件新追加进来的行内容
- 文件的时间戳管理工具
touch
文件:metadate,date
查看文件状态:stat
三个时间戳:
access time:访问时间,简写atime,读取文件内容
modify time:修改时间,简写mtime,改变文件内容(数据)
chang time:改变时间,简写ctime,元数据发生改变
touch命令可以手动修改其中的前两个时间戳:atime和mtime
#touch [OPTION...] FILE...
-a -m
-t use [[CC]YY]MMDDhhmm[.ss] instead of current time
-c:若文件不存在,不予创建
- 文件管理
cp,mv,rm
复制:cp 默认复制文件,-r递归复制目录
cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...
常用选项:
-i:交互式,提醒是否覆盖
-r,-R:递归复制目录
-a:归档,相当于-dR –preserv=all
-p:same as --preserve=mode,ownership,timestamps(权限,属主属组,时间戳)
-f:强制
移动文件:mv(剪切)
删除:rm(不可恢复)
-i:交互式(root默认-i)
-r:递归删除目录
-f:强制删除
说到这里,想提一个梗:”rm -rf”这个命令,强制递归删除,通常这个命令都是指定文件夹用的,比如#rm -rf /tmp/ 就是删除/tmp/这个文件夹下面的所有东西,但是如果后面的文件夹路径没有加对,执行了rm -rf / ,在服务器上也就意味着……(效果参考下图)
值得庆幸的是:在redheat6之前,系统认为所有的管理员都是理性的,所以默认允许管理员执行删根操作。但是在6之后,系统发现有些管理员是糊涂的,所以更改了用法,加强了保护机制和确认,man rm中说明:
但是这项默认只针对rm -rf /,如果是rm -rf /*。。。。。。再见!
- 文本编辑器
nano
nano [OPTIONS] [[+LINE,COLUMN] FILE]...
二、bash的基础特性
(1)命令别名(alias)
alias:显示当前shell进程所有可用命令别名
alias name=value:定义别名
在命令行中定义的别名,仅对当前shell进程有效。若想永久生效,要定义在配置文件中。
仅对当前用户:~/.bashrc
对所有用户有效:/etc/bashrc
配置文件修改后,已连接其他终端用户需要让bash进程重新读取配置文件:
source /PATH/TO/XXX 或者 . /PATH/TO/XXX
撤销别名:unalias [-a] name
执行原命令:\COMMAND
(2)glob(globbing)
bash中用于实现文件名“通配”机制
通配符:* ,?,[]
*:
任意长度任意字符:a*b=a123b acdfgb
?:
任意单个字符:a?b=a1b a??b=a12b
[ ]:
匹配指定范围内的任意单个字符:
[0-9]:匹配0-9
[a-z]:不区分大小写
[A-Z]:仅匹配大写字母
[^]:匹配指定范围之外的任意单个字符[^0-9][^A-Z][^0-9A-Z]
专用字符集合:
[:alnum:]数字+字母 [:alpha:]大小写字母 [:blank:] [:cntrl:]
[:digit:]数字 [:graph:] [:lower:]小写字母 [:print:]
[:punct:]标点符号 [:space:]空格 [:upper:]大写字母 [:xdigit:]
(3)bash的快捷键
Ctrl+l:清屏,相当于clear
Ctrl+a:光标跳至命令首部
Ctrl+e:光标跳至命令尾部
Ctrl+c:中止命令
Ctrl+u:删光标到命令行收
Ctrl+k:删光标到命令行尾
(4)bash的I/O重定向及管道
打开的文件都有一个fd:file descriptor(文件描述符)
标准输入:keyboard;0
标准输出:moniter;1
标准错误输出:moniter;2
I/O重定向:改变默认标准(输入/输出)位置
输出重定向:COMMAND > NEW_POS; COMMAND >> NEW_POS;
>:覆盖重定向,目标文件原有内容被清除
>>:追加重定向,新内容追加至目标文件尾部
>|:强制覆盖
#set -C:禁止将内容覆盖输出至已有文件中(只对当前shell有效)
# set +C:打开允许覆盖功能
2>:覆盖重定向错误输出数据流
2>>:追加重定向错误输出数据流
标准输出和错误输出各自定向至不同位置:
#COMMAND > /PATH/TO/FILE.TXT 2> /PATH/TO/ERROR.TXT
合并标准输出和错误输出为同一个数据流进行重定向:&
&>:覆盖重定向
&>>:追加重定向
#COMMAND > /PATH/TO/FILE.TXT 2> &1
#COMMAND > /PATH/TO/FILE.TXT 2>> &1
输入重定向:<
tr命令:转换或删除字符
tr [OPTION]... SET1 [SET2] :SET1中的字符替换为SET2中对位的字符
tsst666中的小写字母全部替换为大写字母:
tr -d SET1 :删除SET1字符
HERE Documentation:<<
#cat << EOF
#cat >> /tmp/tsst666 <<EOF
EOF结束前的所有内容追加至/tmp/tsst666:
管道
|:第一个命令的输出成为最后一个命令的输入
COMMAND1 | COMMAND2 | COMMAND3
最后一个命令会在当前shell进程的子shell进程中执行
tee:一个输入两路输出
tee [OPTION]... [FILE]...
在屏幕输出后同时保存到/tmp/test22文件中(覆盖输出)
将/etc/passwd中的前五行转换为大写,保存到/tmp/passwd.our
(5)文本处理工具:wc,cut,sort,uniq
wc命令:统计行数、单词、字节(-l -w -c)
passwd下有34行,53个单词,1621个字节
cut命令:剪切并输出至标准输出
-d:指明分隔符
-f:指明字段。1 1,2 1-4 1-3,7等
--output-delimiter=STRING :输出分割符替换
以:为分割,截取/etc/passwd中的第1,3列
sort命令:排序(默认按字母排序)
sort [OPTION]... [FILE]...
-r:逆序排序
-f:忽略字符大小写
-t DELIMITER:字段分隔符
-k NUMBER:以指定字段为标准排序
-u:uniq,排序后去重
将/etc/passwd中以:分割的第三列按数值大小排序
切一下更直观
uniq命令:去重复:连续且完全相同,方位重复
uniq [OPTION]...[FILE]..
-c:显示每行重复出现的次数
-d:仅显示重复过的行
-u:仅显示不曾重复的行
练习:取出/etc/passwd文件的第6-10行,并将这些信息按第三个字段的数值大小排序