1. shell 获取当前脚本的路径
#!/bin/bash
#获取当前执行文件路径
filepath=$(cd "$(dirname "$0")"; pwd)
echo "filepath== "$filepath
#获取当前执行文件的父路径
parentpath=$(dirname $filepath)
echo "parentpath== "$parentpath
bbs-MacBook-Pro-10:myedu pazhang$ ./test.sh
filepath== /Users/pazhang/project/workspace/myedu
parentpath== /Users/pazhang/project/workspace
2. shell 读文件
方式一:重定向方式
while read LINE
do
echo $LINE
done < /adms/config/database.yaml
方式二:管道方式
cat /adms/config/database.yaml |while read LINE
do
echo $LINE
done
3. shell 去掉字符串前后空格
var=" abc "
var="${var#"${var%%[![:space:]]*}"}"
var="${var%"${var##*[![:space:]]}"}"
echo "-"$var"-"
运行结果为:
-abc-
前后空格被去掉了
4. 创建目录
mkdir zhang
mkdir -p liu/liu
第一种方式是创建一个目录,第二种方式是递归创建目录,即可以创建嵌套的目录,此时需要-p参数。
5. 删除文件或目录
rm file
rm -rf dir
-r: 表示删除目录
-f: 表示强制删除
6. 拷贝文件或目录
cp file dir/
cp -r dir1 dir/
第一条是拷贝文件到dir目录,第二条是拷贝dir1目录到dir目录,注意最后的斜线,不能省
cp file dir/file1
这条命令表示把file拷贝到dir目录,并且名称改为file1
-r: 复制目录
-p: 连带文件属性复制
-d: 若原文件是链接文件,则复制链接属性
-a: 相当于 -pdr
7. 剪切文件或目录
mv file dir/
mv dir1 dir/
mv file1 file
第一条表示剪切file到dir目录下
第二条表示剪切目录dir1到dir目录下
第三条表示把file1重命名为file
注:mv命令不区分文件和文件夹,因此没有-r 参数
8. 查看目录
ls
ls -l
ll
ll -h
ll -a
ls会把当前目录下的所有目录和文件列出来,不包含隐藏文件
ls -l 会把当前目录的所有文件和目录列出来,并且包含属性信息,不包含隐藏文件
ll 就是 ls -l
ll -h 会和 ls -l 一样,但是会把属性显示成人性化的方式,比如文件大小,会显示成x.k x.m 等,带单位的信息。
-a: 会列出所有文件,包括隐藏文件
9. 查看系统内核版本
cat /proc/version
查看当前系统版本,非内核版本可用如下命令
lsb_release -a
10. 查找文件
locate file
数据库的位置:/var/lib/mlocate
但是数据库不是实时更新的,更新周期为一天,你今天创建的文件是搜索不到的,怎么办呢?
有办法,执行如下命令:
sudo updatedb
就会更新locate后台数据库,然后就可以搜到了。
优点:速度快
缺点:只能按照文件名搜索
注意:locate会读取一个配置文件/etc/updatedb.conf,内容如下:
PRUNE_BIND_MOUNTS="yes"
# PRUNENAMES=".git .bzr .hg .svn"
PRUNEPATHS="/tmp /var/spool /media /home/.ecryptfs"
PRUNEFS="NFS nfs nfs4 rpc_pipefs afs binfmt_misc proc smbfs autofs iso9660 ncpfs coda devpts ftpfs devfs mfs shfs sysfs cifs lustre_lite tmpfs usbfs udf fuse.glusterfs fuse.sshfs curlftpfs ecryptfs fusesmb devtmpfs"
如果第一行的值为yes,表示下面的过滤条件全部生效,第三行表示过滤一些目录,如果你在这些目录下新建了文件,那么你是搜索不到的。
PRUNE_BIND_MOUNTS:开启搜索限制
PRUNENAMES:搜索时,不搜索的文件类型
PRUNEPATHS:搜索时,不搜索的文件路径
PRUNEFS:搜索时,不搜索的文件系统
whereis filename
-b: 只查找可执行文件
-m: 只查找帮助文件
which filename
搜索命令所在的目录和别名
find [搜索范围][搜索条件]
例如:
find / -name pazhang.txt
在跟目录下搜索名称为pazhang.txt的文件
避免大范围搜索,会非常耗费系统资源
find是在系统中搜索符合条件的文件名。如果需要匹配,使用通配符匹配,通配符是完全匹配。
通配符:
*: 匹配任意内容
?: 匹配任意一个字符
[]: 匹配任意一个括号内的字符
find /root -iname pazhang.txt
#不区分大小写
find /root -user root
#按照所有者搜索
find /root -nouser
#查找没有所有者的文件
find /var/log -mtime +10
查找10天前修改的文件
-10: 10天内修改的文件
10: 10天当天修改的文件
+10: 10天前修改的文件
atime: 文件访问时间
ctime: 修改文件属性的时间
mtime: 修改文件内容的时间
find /var/log -size +10k
查找文件大于10k的文件
后边的参数于时间类似
find /var/log -size +10M
注意:使用M时用大写M,使用k时用小写k,也不要省去单位
find /var/log -inum 111111
根据I节点查询文件
find /var -size +20k -a -size -50k
查找大于20k小于50k的文件
-a: and,逻辑与,两个条件都满足才行
-o: or,逻辑或,两个条件满足一个即可
find /var -size +20k -a -size -50k -exec ls -lh {} \;
-exec 用于执行第二条命令
固定格式:-exec 空格 命令 空格 {}空格\;
grep -v "xxx" error.log
在文件中匹配符合条件的字符串
-i: 忽略大小写
-v: 取反,排除制定的字符串
find命令:在系统中搜索符合条件的文件名,如果需要匹配使用通配符匹配,通配符是完全匹配。
grep命令:在文件中搜索符合条件的字符串,如果需要匹配使用正则表达式进行匹配,正则表达式匹配是包含匹配。
11. 帮助命令
man 命令
查看命令的帮助文档,man只能用于查看Linux外部命令,比如ls,不能查看内部命令,比如cd
help 命令
help命令也是用于查看命令帮助文档,但是只能用于查看Linux内部命令,而不能查看外部命令,和man刚好相反。
注:那么如何判断命令是内部命令还是外部命令呢?请使用:whereis 命令,如果返回可执行文件的目录,表示是外部命令,否则是内部命令。
info 命令
进入帮助文档之后,可以做如下操作:
回车:在带有*号标记的行按回车,进入子帮助页面
u: 进入上层页面
n: 进入下一个帮助小节
p: 进入上一个帮助小节
q: 退出
ls --help
查看ls的帮助文档,简洁版的。
12. 压缩和解压缩命令
zip 压缩文件名 源文件
压缩文件
zip -r 压缩文件名 源目录
压缩目录
unzip 压缩文件名
解压缩文件
.gz格式
gzip 源文件
压缩为.gz格式的压缩文件,压缩后,源文件会消失
gzip -c 源文件 > 压缩文件
这个命令可以保留源文件,其实就是把压缩的内容写入到压缩文件中
gzip -r 目录
压缩目录下所有的子文件,自命令不会把文件打包,而是逐个压缩,目录不会被压缩
gzip -d 压缩文件
解压缩文件,压缩文件不会保留,会被删除
gunzip 压缩文件
解压缩文件
gunzip -r 压缩文件目录
可以解压目录下的所有压缩文件
.bz2格式
bzip2 源文件
压缩为.bz2格式,不保留源文件
bzip2 -k 源文件
压缩后保留源文件
注:bzip2命令不能压缩目录
bzip2 -d 压缩文件
解压缩文件,不保留压缩文件,使用-k可以保留
bunzip2 压缩文件
不保留压缩文件,使用-k可以保留
tar -cvf 打包文件名 源文件
tar -cvf test.tar test
可以打成tar包
选项:
-c: 打包
-v: 显示过程
-f: 指定打包后的文件名
tar -xvf tar文件
解压tar包
-x: 解压
.tar.gz格式
tar -zcvf 压缩包名.tar.gz 源文件
压缩
-z: 压缩为.tag.gz格式
tar -zxvf 压缩包名.tar.gz
解压缩.tag.gz文件
.tar.bz2格式
tar -jcvf 压缩包名.tar.gz 源文件
压缩
-j: 压缩为.tar.bz2格式
tar -jxvf 压缩包名.tar.gz
解压缩.tar.bz2文件
tar -zxvf xxx.tar.gz -C /tmp
tar -jxvf xxx.tar.bz2 -C /tmp
-C: 指定解压位置,注意是大写C
那么问题来了,怎么压缩到指定位置,其实很简单,例如:
tar -zcvf /tmp/xxx.tar.gz 源文件
就被压缩到指定目录下了
tar -zcvf /tmp/xxx.tar.gz 源文件1 源文件2
压缩多个文件
tar -ztvf xxx.tar.gz
只查看,不解压
-t: 只查看,不解压
13. shutdown命令
shutdown [选项] 时间
shutdown -r 08:00 & //&符号表示后台任务,不影响终端使用
shutdown -h now //立即关机
-c: 取消前一个命令,比如你先使用了定时关机,然后又想取消定时关机任务,就可以使用-c选项
-h: 关机
-r: 重启
halt
poweroff
init 0
这三条命令也可以关机,但是不如shutdown安全,shutdown会在关机前关闭正在运行的服务或程序,能够正确保存数据,而这三条命令却不可以,所以,建议使用shutdown命令
reboot
init 6
重启命令
系统运行级别:
0: 关机
1: 单用户
2: 不完全多用户,不含NFS服务
3: 完全多用户
4: 未分配
5: 图形界面
6: 重启
logout
退出登录
14. 挂载命令
mount
查询系统中已经挂载的设备
mount -a
根据配置文件/etc/fstab的内容,自动挂载
mount [-t 文件系统] [-o 特殊选项] 设备文件名 挂载点
选项:
-t 文件系统:加入文件系统类型来指定挂载的类型,可以ext3、ext4、iso9660等文件系统
-o 特殊选项:可以指定挂载的额外选项
mount -o remount,noexec /home/
重新挂载为不可执行,之后再执行可执行文件时,就会报权限不足
参数 | 说明 |
---|---|
atime/noatime | 更新访问时间/不更新访问时间,访问分区文件时,是否更新文件的访问时间,默认为更新 |
async/sync | 异步/同步,默认为异步 |
auto/noauto | 自动/手动,mount -a命令执行时,是否会自动安装/etc/fstab文件内容挂载,默认为自动 |
defaults | 定义默认值,相当于rw,suid,dev,exec,auto,nouser,async这七个选项 |
exec/noexec | 执行/不执行,设定是否允许在文件系统中执行可执行文件,默认是exec允许 |
remount | 重新挂载已经挂载的文件系统,一般用于指定修改特殊权限 |
ew/ro | 读写/只读。文件系统挂载时,是否具有读写权限,默认是rw |
suid/nosuid | 具有/不具有SUID权限,设定文件系统是否具有SUID和SGID的权限,默认是具有 |
user/nouser | 允许/不允许普通用户挂载,设定文件系统是否允许普通用户挂载,默认是不允许,只有root可以挂载分区 |
usrquota | 写入代表文件系统支持用户磁盘配额,默认不支持 |
grpquota | 写入代表文件系统支持组磁盘配额,默认不支持 |
挂载光盘命令
mkdir /mnt/cdrom
建立挂载点
mount -t iso9660 /dev/sr0 /mnt/cdrom
挂载光盘
也可以使用如下命令:
mount -t iso9660 /dev/cdrom /mnt/cdrom
因为/dev/cdrom 是 /dev/sr0 的一个软连接,但是建议使用第一种方式
另外-t 参数也可以省略,因为默认的文件系统为iso9660
卸载光盘命令
umount /mnt/cdrom
卸载光盘
卸载命令不可省略,挂载使用完之后,一定要卸载
挂载U盘命令
fdisk -l
查看系统中识别的硬盘
因为U盘的名称不固定,所以要先查询一下
mount -t vfat /dev/sdb1 /mnt/usb/
挂载U盘
vfat:指定U盘的文件系统是fat32
注意:Linux默认不支持NTFS文件系统的
15. 查看登录用户信息
w 用户名
命令输出:
USER:登录的用户名
TTY:登录终端
FROM:从哪个IP登录
LOGIN@:登录时间
IDLE:用户闲置时间
JCPU:指的是和终端连接的所有进程占用的时间。这个时间里并不包括过去的后台作业时间,但却包括当前正在运行的后台作业所占用的时间
PCPU:是指当前进程所占用的时间
WHAT:当前正在运行的命令
who 用户名
命令输出:
-用户名
-登录终端
-登录时间(登录来源IP地址)
查询当前登录和过去登录的用户信息
last
last命令默认是读取/var/log/wtmp文件数据
命令输出:
-用户名
-登录终端
-登录IP
-登录时间
-退出时间(在线时间)
查询所有用户的最后一次登录时间
lastlog
lastlog命令默认是读取/var/log/lastlog文件数据
命令输出:
-用户名
-登录终端
-登录IP
-最后一次登录时间
16. echo
echo -e "\e[1;31m hello \e[0m"
输出颜色
30m = 黑色,31m = 红色, 32m = 绿色, 33m = 黄色
34m = 蓝色,35吗= 洋红, 36m = 青色, 37m = 白色
17. alias别名
alias
查看系统中所有命令别名
alias 别名='原命令'
设定别名
vim ~/.bashrc
写入环境变量配置文件
把新的别名加入到文件之后,执行如下命令:
source .bashrc
新的别名就会生效
unalias 别名
删除别名
注:命令生效顺序
1. 执行绝对路径或相对路径的执行命令
2. 执行别名
3. 执行bash的内部命令
4. 按照$path环境变量定义的目录查找顺序找到的第一个命令
18. 常用快捷键
ctrl + c: 强制终止当前命令
ctrl + l: 清屏
ctrl + a: 光标移动到命令行首
ctrl + e: 光标移动到命令行尾
ctrl + u: 从光标所在位置删除到行首
ctrl + z: 把命令放入后台
ctrl + r: 在历史命令中搜索
19. history历史命令
history [选项] [历史命令保存文件]
选项:
-c: 清空历史命令
-w: 把缓存中的历史命令写入历史命令保存文件~/.bash_history
历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile中进行修改
HISTSIZE=1000 改成 HISTSIZE=10000
使用上、下箭头调用以前的历史命令
使用 ”!n“ 重复执行第n条历史命令
使用 “!!” 重复执行上一条命令
使用 “!字符串” 重复执行最后一条以该字符串开头的命令
20. 输出重定向
1.标准输入输出
设备 | 设备文件名 | 文件描述符 | 类型 |
---|---|---|---|
键盘 | /dev/stdin | 0 | 标准输入 |
显示器 | /dev/stdout | 1 | 标准输出 |
显示器 | /dev/stderr | 2 | 标准错误输出 |
2.输出重定向
21. 管道符
1.多命令顺序执行
2.管道符
命令格式:
命令1 | 命令2
#命令1的正确输出作为命令2的操作对象
例如:
apt-cache mongodb | grep mongodb
查询mongodb安装包的时候把包含mongodb字符串的过滤出来
22. 通配符
Bash中的一些特殊符号:
23. VIM 编辑器使用
vim fileName //打开或创建文件
vim + fileName //打开文件,并且光标定位在最后一行
vim +3 fileName //打开文件,光标定位到第三行
vim +10000 fileName //如果你的文件没有10000行,那么作用和只是用“+” 一样,定位到最后一行
vim +/darren fineName //把光标定位到第一次出现darren字符串的位置,按n可以切换到下一次出现的行
vim fileName1 fileName2 fileName3 //会首先打开fileName1,这时可以输入“:n” 回车,切换到fileName2,依次类推,如果想回到fileName1,
输入“:N” 或 “:prev”按回车,回到上一个
注:第一个命令中的“n”可以循环转圈,第二个“n”不可以
底行模式常用指令
:w 保存到硬盘
:q 退出,不保存
:! 强制的意思一般和q一起使用:q!,表示强制退出
:ls 打开多个文件时,列出打开的所以文件
:n 打开多个文件是,切换到下一个打开的文件
:15 定位到第15行
/xxx 从光标位置向后搜索
?xxx 从光标位置开始,向前搜索
命令模式常用指令
h 光标左移
j 光标下移
k 光标上移
l 光标右移
ctrl + f 向下翻页(front)
ctrl + b 向上翻页(back)
ctrl + d 向下翻半页(down)
ctrl + u 向上翻半页(up)
dd 删除光标所在的行
o 在光标所在的行的下方插入一行,并切换到输入模式
yy 复制光标所在的行
p 在光标所在的行的下方粘贴
P 在光标所在的行的上方粘贴
24. Terminal 的光标快捷键
光标移动到行首 ctrl + a
光标移动到行末 ctrl + e
单词移动 alt + →(方向键) (测试仅Mac可用)
从当前光标删除到行首 ctrl + u
从当前光标删除到末尾 ctrl + k
粘贴刚才删除的内容 ctrl + y
清除屏幕 ctrl + l
查找之前使用命令 ctrl + r
25. tail
tail filename 默认查看最后10行
tail -n 10 filename 查看最后10行
tail -n +10 filename 查看第10行到最后一行
tail -q -n 10 file1 file2 file3 显示最后10行,并且不显示文件名的文件头。
tail -f filename 动态输出查询文件的内容
26. head
head filename 默认查看开始10行
head -n 10 filename 查看开始10行
head -n -10 filename 查看除最后10行外剩余的内容
head -q -n 10 file1 file2 file3 显示开始10行,并且不显示文件名的文件头。
27.