目录

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