linux
linux主要目录
- /bin 放二进制文件,都是可以运行的
- /lib 存放系统最基本的动态连接共享库
- /dev 放置外接设备,光盘u判断等,外接设备是不能直接使用的,需要挂载(类似于windows的分配盘符)
- /etc 放置配置文件
- /home 除了root用户以外的用户家目录
- /proc linux运行时候的进程
- /root root账户自己独有的家目录
- /sbin 全称是super binary,就是super权限才能运行的二进制文件
- /tmp 临时文件
- /opt 可选的意思,放些大型软件服务,产生的所有文件也和改软件同目录,卸载的时候直接删除目录即可
- /usr 用户自己安装的软件,类似windows的programfiles目录
- /usr/local 主要放手动安装的软件,既不是软件管理软件安装的
- /var 程序或系统的日志目录
- /media 系统会自动识别一些设备,比如u盘
- /mnt 用户临时外接设备挂载的时候,挂载到此目录
命令
指令格式: 指令 选项 操作对象 命令的查找顺序为:先在当前目录查找,如果没有再去PATH中查找。
常用
ls
-a 所有文件 -l 多列信息 -t 按时间 -F 简单名称并显示文件类型 -h 文件大小带单位
ls -l共8列信息: 文件权限、链接数、用户名、组名、大小、最后修改日期、最后修改时间、文件名
mkdir
-p 多级目录
cp
cp src dst cp复制文件夹时,需要添加-r选项
mv
移动文件,或者重命名 mv src dst
输出重定向
“>”会覆盖原内容 “»“追加内容
进阶指令
df
查看磁盘空间 df -h 一般看结果的第一行
free
查看内存 free -m以M为单位
tail
查看一个文件的末尾n行,默认是10行
tail -f还可以实时查看文件的内容
wc
文件内容信息统计 -l 行数 -c 字节数 -w单词数 -m字符数
date
读取、设置时间
时间格式: CET欧洲时间 GMT格林威治时间 UTC世界标准时间 CST中国标准时间 CET=UTC/GMT + 1小时 CST=UTC/GMT +8 小时 CST=CET+9
读取时间:
date +%F 2016-01-02
date "+%Y-%m-%d %H:%m:%S" 2016-01-02 15:04:05
date -d "-/+1 day/month/year" "+%Y-%m-%d %H:%m:%S" 2016-01-02 15:04:05
id
查看用户的id,组id等
ps
process status的缩写 -a 同一终端下的所有进程 -A 所有进程,等于-e
top
实时显示进程的状态。
lsof
list of file的缩写 可以查看端口占用lsof “:8080”
netstat
查看网络连接状态 常用的是netstat -tnpl -t只列出tcp连接 -n显示IP地址和端口 -p显示程序名或pid -l显示作为监听的进程
du
查看文件夹的大小 -s 汇总大小 -h 带单位 du -sh 目录
find
在路径下搜索文件的文件 find 路径 选项 选项值 -name 按文件名来搜索 -type 按文件类型来搜索 f文件 d文件夹 例子 find /etc -name xx.conf
service
启动关闭服务 service 服务名 start/stop/restart
uname
查看系统信息 -a all详细的信息 uname -all
链接文件
为文件创建快捷方式(链接文件) ln -s 源文件 目标文件
vim
- 命令模式:通过快捷键进行删除行,粘贴、光标移动等操作
- 编辑模式:进行编辑
- 末尾模式:进行搜索、替换、保存、退出等
模式切换
命令>末尾 : 末尾>命令 连续两次esc
命令>编辑 i 编辑>末尾 esc
命令模式
-
撤销上一次操作 u
-
光标移动到行首 ^按键,也就是shift + 6
-
光标移动到行尾 $按键,也就是shirft + 4
-
光标移动到首行 gg (good game)重新开始意思
-
光标移动到末行 G
-
向上翻屏 ctrl + b backwards
-
向下翻屏 ctrl + f forward
-
复制一行 yy 只是复制,并没有粘贴
-
粘贴 p
编辑模式
进行编辑即可
末尾模式
- 显示行号 set number
- 不显示行号 set nonumber
- 光标移动到特定行 行号+回车
- w保存
- q退出
- wq保存退出
- x智能退出,如果修改了就会保存后退出,没修改直接退出
- 搜索 /关键字 默认是大小写敏感的,在关键字后面加\c即可不敏感
- set hlsearch 搜索后的关键字就会高亮
- set nohlsearch
- 替换所有的关键字 %s/搜索的关键字/替换字/g
init进程
初始化进程init运行级别 0 关机 3 不带桌面的 5 带桌面的 6 重启
例子:init 0关机,通过init进程关机。 init 命令需要root权限
用户管理
主要涉及三个文件 /etc/passwd 用户信息 /etc/group 用户组的信息 /etc/shadow 用户的密码信息
useradd
useradd 可选项 用户名 -g 主要用户组(一个用户可以有多个组) -G 附加组,非主要组 -u 用户ID
例子:useradd zhangsan
usermod
usermod 可选项 用户名 -g 主要用户组(一个用户可以有多个组) -G 附加组,非主要组 -u 用户ID -l 修改用户名
修改用户密码
passwd 用户名 注意:用户修改自己的密码,不用跟用户名
切换用户
su 用户名 普通用户名 su 切换到用户
删除用户
userdel 用户名 -r 删除用户的时候,家目录也删除
用户组管理
groupadd 添加用户组 groupmod 修改用户组 groupdel 删除用户组
用户权限
默认用户是没有suod命令,用户或用户组可以执行的sudo权限可以在/etc/sudoers配置
ssh
ssh远程连接传输协议,默认端口22 注意:端口0-65535
文件权限
文件权限 d rwx rwx rwx 首位d代表文件夹,-代表文件,l代表链接文件。 第一组rwx是文件的拥有者权限,第二组是组内其他成员操作权限,第三组是组外其他人员。
文件可读:可以读取里面的数据。 文件可写:可以写数据,可以删除该文件。 文件可执行:是可执行文件。
特殊权限SUID、SGID、Sticky
SUID(Set User ID)
该属性只对有执行权限的文件有效,对目录无效。执行具有SUID权限的程序时,引发的进程的所有者是程序文件的所有者,而不是启动程序的用户。
例子:
ls
-rwsr-xr-x 1 root root 47032 Feb 16 2014 /usr/bin/passwd
这样非root用户执行/usr/bin/passwd命令,就等于所有者也就是root在执行。
SGID(Set Group ID)
对于可执行文件,SGID与SUID类似,引发的进程的所有组是程序文件所属的组。
例子: drwxrwsr-x 2 root staff 4096 Apr 10 2014 local
Sticky
仅对目录有效。 带sticky属性的目录下的文件或目录可以被其拥有者删除或改名。常利用sticky属性创建这样的目录:组用户可以在此目录中创建新文件、修改文件内容,但只有文件所有者才能对自己的文件进行删除或改名。
例子: drwxrwxrwt 8 root root 4096 Apr 4 23:57 tmp
修改特殊位
那么原来的执行标志x到哪里去了呢? 系统是这样规定的, 如果本来在该位上有x, 则这些特殊标志显示为小写字母 (s, s, t). 否则, 显示为大写字母 (S, S, T)。 chmod u+s temp 加setuid权限 chmod g+s temp 加setgid权限 chmod o+t temp 加sticky权限
修改文件属性
修改文件所有者
chown -R 属主名 文件名 -R是递归,所有子文件均修改
修改文件组
chgrp -R 组名 文件名
更改文件权限
修改文件权限一种是通过数字,一种是符号。 数字法:chmod [-R] 777 文件
符号法:chmod[-R] u/g/o/a =/+/- r/wx
目录权限
目录和常规文件一样使用相同的权限位进行标识,但是它们的翻译不同。 文件夹的读:允许用户使用该权限列出目录内容。 文件夹的写:写权限意味着用户使用该权限能够在目录中创建或者删除文件。 文件夹的执行:是否可以cd到改目录下
shell编程
变量
注意,变量名和等号之间不能有空格
- 声明、赋值变量是不需要$符的,引用的时候需要
- 使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变
- 使用 unset 命令可以删除变量
- 可以在定义时加上local命令,此时该变量就成了局部变量。
- 在 Shell 中定义的变量,默认就是全局变量。
- 全局变量只在当前 Shell 进程中有效,对其它 Shell 进程和子进程都无效。如果使用
export
命令将全局变量导出,那么它就在所有的子进程中也有效了,这称为“环境变量”。
读取输入
read -p '请输入' 变量
字符串
字符串单引号、双引号包括都可以,但是双引号里面可以有转义和变量
获取字符串长度,echo ${#str}
获取子串,echo ${string:1:4}
数组
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
数组名=(值1 值2 ... 值n)
array_name[0]=value0
获取数组所有元素,echo ${array_name[@]}
获取数组长度,length=${#array_name[@]}
注释
多行注释: :«EOF … EOF
单行注释:一个井号
获取参数
$0获取程序文件名 $n第n个参数
算术运算符
bash原生不支持简单的算术运算的,可以利用expr,(()),[],bc等实现 前三者只能进行整数运算,后者可以小数。
expr
v=expr 2 + 2
- 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2
- 完整的表达式要被
- 乘号需要转义*
$(())
echo $(( 2 + 5 )) 不需要转义乘号
$[]
r=$[ 4 + 5 ]
bc bc可以看做是linux计算器,支持小数。 浮点数的小数位数是由内建变量scale控制的。scala变量的默认值是0,在scala值被设置之前,bc计算结果不包含小数位。
在脚本中我们可以这样使用bc:
variable=$(echo “options; expression” | bc)
var1=$(echo “scale=4; 3.44 /5” | bc)
注意:小于1的时候,结果是没有整数的0的,可以这样解决:
res1=$(printf “%.2f” echo "scale=2;1/3"|bc
)
关系运算符
[a -eq b] 判断相等 相当于= [a -ne b] 判断不相等 相当与!= [a -lt b] 小于 [a -gt b] 大于
#!/bin/bash
a=2
b=2
if [ ${a} = ${b} ]
then
echo "yes"
fi
if [ ${a} -eq ${b} ]
then
echo "yes"
else
echo "no"
fi
if [ ${a} -eq 34 ]
then
echo "yes"
elif [ ${a} -lt 20 ]
then
echo "no"
fi
非与或
-o 或 -a 与 !非
#!/bin/bash
a=2
b=3
if [ ${a} = ${b} -o ${a} -lt ${b} ]
then
echo "yes"
fi
字符串运算符
# 判断是否相等
if [ $str = $str2 ]
then
echo "yes"
fi
# 判断是否为空
if [ -z $str ]
then
echo "zero"
fi
文件运算符
文件测试运算符用于检测 Unix 文件的各种属性。
f="./hello"
if [ -f $f ]
then
echo "file"
fi
-f 是否为文件 -d是否为目录 -e文件是否存在 -x是否可执行
流程控制
if判断:
num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
echo '两个数字相等!'
else
echo '两个数字不相等!'
fi
for循环:
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
#第二种:
for (( i=0; i < 3; ++i ))
do
echo $i
done
while循环:
#!/bin/bash
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
命令执行结果赋值
shell编程中把命令的执行结果赋值给变量:
第一种方法:
v=$(ls )
第二种:
v=`ls`
压缩文件
gzip
-
压缩后的格式为:*.gz
-
这种压缩方式不能保存原文件;且不能压缩目录
命令举例: gzip buodo gunzip buodo.gz
zip
- 与gzip相比:可以压缩目录; 可以保留原文件;
选项: -r(recursive) 递归压缩目录内的所有文件和目录
命令举例: zip boduo.zip boduo unzip boduo.zip
tar
命令选项: -z(gzip) 用gzip来压缩/解压缩文件 -j(bzip2) 用bzip2来压缩/解压缩文件 -v(verbose) 详细报告tar处理的文件信息 -c(create) 创建新的档案文件 -x(extract) 解压缩文件或目录 -f(file) 使用档案文件或设备,这个选项通常是必选的。
命令举例: tar -zvcf buodo.tar.gz buodo tar -zvxf buodo.tar.gz
awk
awk是一个强大的文本分析工具,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
调用awk有多种方法,常用命令行方法:
awk [-F field-separator] ‘commands’ input-file(s)
其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。 在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格
命令举例:
# 查看ls -l结果的第一列
ls -l ./ | awk '{print $1}'
案例
读取一个文件每行内容
利用管道
#!/bin/bash
f="./hello_test.go"
cat $f | while read line
do
echo $line
done