快速搞定linux基础,一些常用的概念、基础命令,相对不复杂的模块都在一篇文章篇幅内总结完。

linux基础

CPU架构

1x86
2x64(amd64)
3m6800(m68k)
4arm
5ultrasparc solaris
6power aix
7powerpc(ppc)
8MIPS
9alpha hp-ux

程序管理

  • 程序的组成部分
    • 二进制程序
    • 配置文件
    • 库文件
    • 帮助文件
  • 程序包管理器
    • 程序的组成文件打包成一个或有限几个文件:
    • 安装:
    • 卸载:
    • 查询:

发行版

1Debian:dpkg,apt-get  (推荐ubuntu,社区丰富,随着容器技术兴起,不少公司使用此做服务器)
2RedHat:rpm, yum —> dnf (centos7)
3SuSE:rpm, zypper
4ArchLinux:port
5Gentoox
6Kali

安装Linux

Linux镜像站

http://mirrors.aliyun.com

http://mirrors.163.com

http://mirrors.aliyun.com/ubuntu-releases/18.04/s

关机

1reboot # 重启
2poweroff #关机

设置字符编码方式

1locale
2localectl -h
3localectl set-locale LANG=zh_CN.UTF-8

ssh 远程连接linux

1ss -tnl | grep 22

查看网卡地址

1ifconfig
2ip addr [list]   

防火墙

当前有效

1iptables -L -n   # 查看防火墙规则
2iptables -F      # 清除防火墙规则
1systemctl stop firewalld.service  # centos7 关闭防火墙服务

永久有效

1systemctl disable firewalld.service  # centos 7

终端设备

  • 多任务、多用户
  • 物理终端,控制台:console
  • 虚拟终端:6个 Ctrl+Alt+[F1-F6] tty
  • 串行终端:ttyS
  • 伪终端:pty

linux一切皆文件

硬件设备也通过文件表示:

  • 物理终端:/dev/console
  • 虚拟终端:/dev/tty# [1,6]
  • 串行终端:/dev/ttyS#
  • 伪终端:/dev/pts/#
1echo $SHELL #查看接口程序
2tty  #查看终端设备

界面提示

1[root[@localhost](https://github.com/localhost) ~] COMMAND
1  #:管理员账号,为root; 拥有最高权限,能执行所有操作;
2  $:普通用户,非root用户;不具有管理权限,不能执行系统管理类操作;

启动程序目录

1 /etc/init.d

命令语法

命令的语法通用格式

1# COMMAND OPTIONS ARGUMENTS

COMMAND

命令本身是一个可执行的程序文件:二进制格式的文件,有可能会调用共享库文件:

  • 多数系统程序文件都存放在:

    • 普通命令:/bin,/usr/bin,/usr/local/bin
    • 管理命令:/sbin,/usr/sbin,/usr/local/sbin
  • 共享库:

    • 32bits的库:/lib,/usr/lib,/usr/local/lib
    • 64bits的库:/lib64,/us/lib64,/usr/local/lib64
  • 命令分为两类:

    • 由shell程序的自带的命令:内置命令(builtin)
    • 独立的可执行程序文件,文件名即命令名:外部命令
  • 环境变量:PATH 从哪些路径中查找用户键入的命令字符串所对应的命令文件; 命令查找顺序是自左向右的

  • shell程序是独特的程序,负责解析用户提供的命令;

OPTIONS

选项有两种表现形式:

  • 短选项:-C

    如果一命令同时使用多个短选项,多数可合并:-l -d = -ld

  • 长选项 –word , 例如 – help , –human-readable

ARGUMENTS

命令的作用对象; 命令对什么生效;

注意:不同的命令的参数;有些命令可同时带多个参数,多个之间以空白字符分隔;

例如:ls -ld /var /etc

帮助命令

  • 内部命令 help COMMAND

  • 外部命令

COMMAND --help

info command

man command

man 手册语法

位置:/usr/share/man

使用手册:压缩格式的文件,有章节之分

 1man [章节号] keyword    # 查看man帮助文档,若不指定章节号,则自动显示最靠前的章节
 2
 3章节  (重点关心1,5,8 章节)
 41:用户命令; 
 52:系统调用;
 63:C库调用;
 74:设备文件及特殊文件;
 85:文件格式;(配置文件格式)
 96:游戏使用帮助;
107:杂项;
118:管理工具及守护进行;
12
13whatis command     #显示command命令的简要介绍,并且外部命令可以查看所在man文档章节
14mandb        # 建立数据库 (CentOS7,ubuntu)
15man -a keyword    #  查看所有相关帮助文档,若有多章节,上一章节退出后,自动显示下一章节内容
16man -k keyword    # 查看所有含keyword的章节,想实现某个功能却不知道使用什么命令时可以使用
17man -f keyword   #  相当于whatis功能
18man -w [章节号] command    # 显示command的man文档路径
19
20
21SYNOPSIS:
22[]:可选内容;
23<>:必须提供的内容;
24a|b|c:多选一;
25… :同类内容可出现多个;

man命令操作方法

​ 和vim 类似,在此不做介绍

  • 选项: -M /PATH/TO/SOMEDIR:到指定目录下查找命令手册并打开之

常用基础命令

1cat /proc/cpuinfo  #查看cpu信息
2getconf LONG_BIT   # 查看位数
3basename /etc/init.d/rsync      # rsync
4dirname /etc/init.d/rsync       # /etc/init.d
5file `file_path` #查看文件类型
6echo $PATH  # 查看环境变量路径
7type `COMMAND` #查看命令类型

date

 1date
 2date "+%F %T"          # 显示目前时间格式2017-07-17 20:47:36
 3date 071720242017.30   # 修改时间,时间格式为月日小时分年.秒
 4date -d -10day +%A     # 显示10天前是星期几
 5
 6
 7ntpdate 172.18.0.117  # 和服务器172.18.0.1时间同步
 8
 9clock     #   显示硬件时间   or    hwclock
10#  Mon 17 Jul 2017 08:33:35 PM CST  -0.799711 seconds
11clock -w #以系统时间为准
12clock -s #以硬件时间为准
13
14
15timedatectl list-timezones # 查看时区
16timedatectl set-timezone Africa/Abidjan      # 修改时区
17date # 修改完时区查看

clock

1clock 
2# or 
3hwclock 
4
5-s, --hctosys #以硬件时钟为准,校正系统时钟
6
7-w, --systohc #以系统时钟为准,校正硬件时钟

shutdown

1shutdown +3 systerm will shutdown  # 设置3分钟之后关机
2shutdown -c # 取消关机

screen

 1#创建新screen会话
 2screen –S [SESSION]
 3# 加入screen会话
 4screen –x [SESSION]
 5# 退出并关闭screen会话
 6exit
 7#剥离当前screen会话
 8Ctrl+a,d
 9#显示所有已经打开的screen会话
10screen -ls
11#恢复某screen会话
12screen -r [SESSION]
  • 命令如果在执行的过程中断网,怎么恢复
 1[root@centos7 ~]#screen
 2[root@centos7 ~]# yes       
 3 断网-重现连接
 4[root@centos7 ~]#screen -ls
 5[root@centos7 ~]#screen -r
 6
 7# screen命令基本使用总结
 8#screen -ls   //查看
 9#screen -S  screen_name  // 创建
10#screen -r   screen_name|pid  //恢复
11#screen -S  screen_name1
12# ctrl+a   +d     //暂时断开screen 会话  ==  screen -d screen_name

history

history是一个内部命令,每个会话都有自己的命令历史,命令历史先存储在内存中,当退出重新登录后会把内存中的历史命令写入历史文件中( .bash_history)

  • 重复执行上一条命令:使用上方向键,并回车执行
  • !string 重复前一个以“string”开头的命令
  • !?string 重复前一个包含string的命令
  • string1string2将上一条命令中的第一个string1替换为string2
  • command !^ : 利用上一个命令的第一个参数做cmd的参数
  • command !$ : 利用上一个命令的最后一个参数做cmd的参数
  • command !* : 利用上一个命令的全部参数做cmd的参数
  • !$ 表示:Esc, .(点击Esc键后松开,然后点击. 键)

命令history

 1history [-c] [-d offset] [n]
 2history -anrw[filename]
 3history -psarg[arg...]
 4-c: 清空命令历史
 5-d: 删除历史中指定的命令 如history -d 2 表示删除第二条历史
 6n: 显示最近的n条历史
 7-a: 追加本次会话新执行的命令历史列表至历史文件--- (注意是新执行的命令)
 8-n: 读历史文件中未读过的行到历史列表---(比如新开的会话,历史不多,会把历史文件中未读过的行到历史列表中,不重复)
 9-r: 读历史文件附加到历史列表,--- (输入一次就会读一次,会重复)
10-w: 保存历史列表到指定的历史文件---(重新登录也会保存到历史文件中)
11-p: 展开历史参数成多行,但不存在历史列表中---(隐藏历史)
12-s: 展开历史参数成一行,附加在历史列表后---(伪造历)
  • 常用选项
1[root@centos7 ~]#history -c  # 删除内存中的历史,退出重新登录后会从历史文件中把历史读到内存中

如果要想做坏事不被别人发现,可以先删除历史文件、再删除内存中的历史,然后exit。

命令历史相关环境变量

 1HISTSIZE:命令历史记录的条数
 2HISTFILE:指定历史文件,默认为~/.bash_history
 3HISTFILESIZE:命令历史文件记录历史的条数
 4HISTTIMEFORMAT=“%F %T “ 显示时间
 5HISTIGNORE=“str1:str2*:… “ 忽略str1命令,str2开头的历史
 6控制命令历史的记录方式:
 7环境变量:HISTCONTROL
 8ignoredups默认,忽略重复的命令,连续且相同为“重复”
 9ignorespace忽略所有以空白开头的命令
10ignoreboth相当于ignoredups, ignorespace的组合
11erasedups删除重复命令

echo

1echo会将输入的字符串送往标准输出, 输出的字符串间以空白字符隔开, 并在最后加上换行号
2语法:echo [-neE][字符串]
3选项:
4-E (默认)不支持\解释功能
5-n 不自动换行
6-e 启用\字符的解释功能
  • 命令行扩展$( ) 或把一个命令的输出打印给另一个命令的参数
1[root@centos7 ~]#echo "echo $UID"  
2echo 0
3[root@centos7 ~]#echo  `echo $UID`  # 命令调用命令即命令行扩展
40          
  • 括号扩展:{ } 打印重复字符串的简化形式
 1[root@centos7 ~]#echo {a..z}
 2a b c d e f g h i j k l m n o p q r s t u v w x y z
 3[root@centos7 ~]#echo {20..10}
 420 19 18 17 16 15 14 13 12 11 10
 5[root@centos7 ~]#echo {2,5,6}
 62 5 6
 7[root@centos7 ~]#echo {a,b,c}.{txt,log}
 8a.txt a.log b.txt b.log c.txt c.log
 9[root@centos7 ~]#echo {1..100..3}
101 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61 64 67 70 73 76 79 82 85 88 
1191 94 97 100

欢迎界面修改

 1Linux可以设置登录前后的欢迎信息,虽然没啥技术含量,但却是非常实用的一个小技巧。
 2 实现登录消息的功能,可以修改3个文件。 
 31、/etc/issue 本地登陆显示的信息,本地登录前
 42、/etc/issue.net 网络登陆显示的信息,登录后显示,需要由sshd配置
 53、/etc/motd 常用于通告信息,如计划关机时间的警告等,登陆后的提示信息
 6
 7/etc/issue文件是Linux系统开机启动时在命令行界面弹出的欢迎语句文件。
 8先看看里边都有什么
 9\S
10Kernel \r on an \m
11以上就是这个文件的所有内容。感觉很少,但是却很有意思。
12
13\d 本地端时间的日期
14\l 显示第几个终端机的接口
15\n 显示主机的网络名称
16\o 显示 domain name
17\r 操作系统的版本 (类似 uname-r)
18\t 显示本地端时间的时间
19\s 操作系统的名称
20\v 操作系统的版本
21\r详细的内核版本
22\m给出当前操作系统的位数
 1#echo     ##回显
 2-n  ##不换行显示
 3-e  ##解释特殊字符
 4      echo  \033[##m
 5第一个# :3表示前景色
 6第二个# :4表示背景色
 7\033=\e
 8\033[0m  :控制符结束   ## \e[0m 将颜色重新置回
 9#echo  -e "\033[31mhello\033[0m"
10#echo -e "\033[41mhello\033[0m"
11#echo -e "\033[32mhello\033[0m"
12#echo -e "\033[31;42mhello\033[0m"
13#echo -e "\033[31;42;5mhello\033[0m"
14#echo -e  “\e[31;42;5mhello\033[0m"
  • 查看命令提示符格式:echo $PS1

  • 修改命令提示符格式 PS1="[\e[31m][\u@\h \W]$[\e[0m]" \e \033\u 当前用户 \h 主机名简称\H 主机名 \w 当前工作目录\W 当前工作目录基名 \t 24小时时间格式\T 12小时时间格式 ! 命令历史数# 开机后命令历史数

  • 如何修改命令提示符颜色 vim打开/etc/profile.d/env.sh

    写入 export PS1 ="[\e[35m][\u@\h \W]\$[\e[0m]"

  • 保存退出后,输入:. env.sh或者source env.sh让文件生效即可。

  • 如果只想对本地有效,在 .bashrc 中设置即可

hash

  • hash 显示hash缓存
  • hash –l 显示hash缓存的路径和名字
  • hash –d name 清除name缓存
  • hash –r 清除全部缓存

alias命令别名

  • 显示当前shell进程所有可用的命令别名:alias
  • 定义别名NAME:alias NAME='VALUE'
  • 如果想永久有效,要定义在配置文件中 仅对当前用户:~/.bashrc 对所有用户有效:/etc/bashrc
  • 撤消别名:unalias
  • 如果别名同原命令同名,如果要执行原命令,可使用 \

正则表达式

(一)定义:

由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能。

(二)程序支持:

grep, sed, awk, vim等

(三)分类:

基本正则表达式(BRE) 扩展正则表达式(ERE)

(四)元字符分类:

字符匹配、匹配次数、位置锚定、分组

字符匹配

 1.   :任意单个字符
 2[] 指定范围内的任意单个字符
 3[0-9], [:digit:]
 4[a-z] ,  [:lower:]
 5[A-Z],      [:upper:]
 6[:alpha:]  字母
 7[:alnum:]  字母数字
 8[:space:]  空格
 9[[:punct:]]  标点符号
10[^]         指定范围外的任意单个字符
11[:blank:]    空白字符(空格和制表符)

匹配次数

1次数匹配:用来制定匹配其前面的字符的次数
2* 任意次    包含0次    
3.*  匹配任意长度的任意字符
4\?  : 0次或者1次
5\{m\} 匹配m次
6\{m,n\} 匹配m到n次
7\{m,}匹配至少m次 
8\{0,n\}匹配至多次
9\+ 匹配前面的字符至少1次

位置锚定

 1^             <!--行首锚定,用于模式的最左侧-->
 2$             <!--行尾锚定,用于模式的最右侧-->
 3^PATTERN$     <!--用于模式匹配整行-->
 4^$             <!--空行,不含空格-->
 5^[[:space:]]*$     <!--空白行,可能含空格-->
 6\< 或\b     <!--词首锚定,用于单词模式的左侧-->
 7            \<char 锚定词首    
 8            \bchar 
 9\> 或\b     <!--词尾锚定;用于单词模式的右侧-->
10\<PATTERN\>  匹配整个单词

分组、或者

  • 分组:\(\)将一个或多个字符捆绑在一起,当作一个整体进行处理
  • \1表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符,以此类推
  • 后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身
  • 或者:|
1abc\|cd       <!--abc或者cd-->
2a\|bc         <!--a或者bc-->
3\(a\|b\)c     <!--ac或者bc-->
4\(a.b\)\1     #acbacb  匹配
5          #acbadb 不匹配

扩展正则表达式元字符

  • 扩展正则表达式与基本正则表达式的语法基本相同,仅部分元字符删减了\符号
  • 字符匹配,扩展正则表达式字符匹配元字符与基本正则表达式相同
1.       <!--任意单个字符-->
2[]      <!--指定范围的字符-->
3[^]     <!--不在指定范围的字符-->
  • 匹配次数
1* :  匹配前面的字符任意次
2?    匹配前面的字符0或1次
3+ : 匹配前面的字符至少1次
4{m}
5{m,}
6{m,n}
7{0,n}
  • 位置锚定,扩展正则表达式位置锚定元字符与基本正则表达式相同
1^          <!--行首锚定-->
2$          <!--行尾锚定-->
3\<, \b     <!--词首锚定-->
4\>,\b     <!--语尾锚定-->
  • 分组、或者
1()             <!--分组,比基本正则表达式省略了\-->
2\1, \2,...     <!--后向引用-->
3abc|cd         <!--abc或者cd,比基本正则表达式省略了\-->
4a|bc           <!--a或者bc,比基本正则表达式省略了\-->
5(a|b)c         <!--ac或者bc,比基本正则表达式省略了\-->

终端命令提示

1:安装oh-my-zsh

1sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

2、安装zsh-autosuggestions

1git clone git://github.com/zsh-users/zsh-autosuggestions ~/.oh-my-zsh/plugins/zsh-autosuggestions

3、编辑~/.zshrc文件

1vim ~/.zshrc.

找到plugins=(git)这一行,在下方添加一行 【 plugins=(git zsh-autosuggestions) 】

底部添加 source ~/.bash_profile

保存退出

4、重新打开命令行 或

1source ~/.zshrc

bash 特性

1.命令执行状态结果

成功 0 失败 1-255

命令执行完成之后,其状态返回值保存于bash的特殊变量 $?

1 如下例子:
2ls
3echo $?     显示0 代表ls命令成功
4ls p_a      没有p_a
5echo $?    大于0的数字                      

2.引用命令的执行结果

1 $(command)  
2echo $(pwd)
3`command`      # 反引号
4 echo  `pwd`

3.路径补全按tab

4.命令补全按tab

在$PATH 环境变量下查找可执行程序

5.命令历史history

 1bash保存的过去曾经执行过的命令列表
 2		当前shell进程的保存在缓冲区
 3		缓冲区中的命令会在shell退出时保存至文件中,.bash_history
 4	history快捷键:
 5		!#  #为命令历史列表中的命令编号,可用执行第#条命令
 6		!! 执行上一条命令
 7		!-# 执行命令历史列表中 的倒数第#条命令
 8		!$ :引用上一条命令的最后一个参数
 9		!string  //执行最近一次string 开头的命令
10	
11	history
12		-c    : 清空列表	
13		-d #  :  删除指定的历史命令
14		-a :   追加当前会话的命令历史至历史文件中
15
16	命令历史相关的环境变量
17	HISTSIZE  	 //命令历史中可以保存袋命令的个数
18  HISTFILE	   //命令历史文件
19	HISTFILESIZE //命令历史文件中可以保存的命令个数
20	HISTCONTROL  // 控制命令历史的生成	
21	HISTCONTROL=ignoredups  //忽律记录重复的命令,连续的相同命令才为重复;
22	HISTCONTROL=ignorespace //不记录以空白字符开头的命令;

6.bash的快捷键

  • Ctrl+l: 清屏,相当于clear命令;
  • Ctrl+a:跳转至命令开始处;
  • Ctrl+e:跳转至命令结尾处;
  • Ctrl+c:取消命令的执行;
  • Ctrl+u: 删除命令行首至光村所在处的所有内容;
  • Ctrl+k: 删除光标所在处至命令行尾部的所有内容;

7.文件通配符

 1 * :匹配任意长度到任意字符
 2
 3 ? :匹配任意单个字符
 4
 5 [] :匹配指定范围内的单个字符
 6
 7几种特殊 : 
 8     [0-9]
 9      [a-z] 
10      [a-z0-9]
11      [[:upper:]]  #表示所有大写字母
12      [[:lower:]] #所有小写字母
13      [[:alpha:]] #所有字母
14      [[:digit:]] #所有数字
15      [[:alnum:]] #所有数字和字母
16      [[:space:]]  #空白字符
17      [[:punct:]] //标点符号
18 #ls p[^[:alnum:]]a   ##匹配第二个字符是非数字和字母已p开头a结尾的文件名

8.bash配置文件

 1bash的配置文件:
 2
 3		按生效范围划分,存在两类:
 4			全局配置:
 5				/etc/profile
 6					/etc/profile.d/*.sh
 7				/etc/bashrc
 8			个人配置:
 9				~/.bash_profile
10				~/.bashrc
11
12		按功能划分,存在两类:
13			profile类:为交互式登录的shell提供配置
14				全局:/etc/profile, /etc/profile.d/*.sh
15				个人:~/.bash_profile
16				功用:
17					(1) 用于定义环境变量;
18					(2) 运行命令或脚本;
19
20			bashrc类:为非交互式登录的shell提供配置
21				全局:/etc/bashrc
22				个人:~/.bashrc
23
24				功用:
25					(1) 定义命令别名;
26					(2) 定义本地变量;
27
28shell登录:
29	交互式登录:
30		直接通过终端输入账号密码登录;
31		使用“su - UserName”或“su -l UserName”切换的用户
32
33/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
34
35非交互式登录:
36	su UserName
37	图形界面下打开的终端
38	执行脚本
39
40	~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
41
42		编辑配置文件定义的新配置的生效方式:
43			(1) 重新启动shell进程;
44			(2) 使用source或.命令进程;

9.变量的种类及特殊变量和数组

 1bash中的变量的种类:
 2	根据变量的生效范围等标准:
 3	本地变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,
 4	        包括当前shell的子shell进程均无效;
 5	环境变量:生效范围为当前shell进程及其子进程;
 6	局部变量:生效范围为当前shell进程中某代码片断(通常指函数);
 7	位置变量:$1, $2, ...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数;
 8	特殊变量:$?, $0, $*, $@, $#
 9	
10        $# 是传给脚本的参数个数
11        $0 是脚本本身的文件名
12        $1 是脚本后接的第一个参数
13        $2 是脚本后接的第二个参数
14        $@ 是传给脚本的所有参数列表,"$1" "$2" "$3" … "$n"
15        $* 是以一个单字符串显示传给脚本的所有参数,"$1 $2 $3 … $n"
16        $$ 是脚本运行的当前进程ID号
17        $? 是最后运行命令的结束状态码,0表示没有错误,其他表示有错误
18        shift 造成参数变量号码偏移,第二个参数变为$1,以此类推。
19        
20        
21	本地变量:
22		变量赋值 name=value
23		变量引用 ${name} $name
24		查看变量:set
25		撤销变量 : unset name
26	
27        	#bash 开启子shell , 子shell 中无法获得父shell中的变量
28
29	环境变量:
30		变量声明、赋值:
31					
32				1。export name=VALUE
33				2.  name=value
34				    export name
35				3. declare -x name=VALUE
36				4.  name=value
37				    declare -x name 
38				变量引用:$name, ${name}
39				显示所有环境变量:
40					  
41					env
42					printenv
43					declare -x 
44				销毁:
45					unset name
46
47				bash有许多内建的环境变量:PATH, SHELL, UID, 
48				HISTSIZE, HOME, PWD, OLD, HISTFILE, PS1
49			
50		
51		#username=maozhongyu
52		#export username
53		#bash
54		#echo $username    //maozhongyu  子shell中也生效
55		#username=‘maodada’
56		#exit
57		#echo $username  //maozhongyu    子shell修改全局变量并不会影响父shell的值,
58		#bash
59		#username=‘maotiantian’
60		#export username 
61		#exit
62		#echo $username  //maozhongyu  //子shell重新定义username,并导出变量,
63		但父shell 中的username 还是maozhongyu
64		//子shell  unset 变量,无法影响父shell
65
66
67	只读变量:
68				readonly name
69					#username=maozhongyu
70					#readonly username
71					#username=maozhongyu1
72					-bash: name: readonly variable
73				declare -r name
74
75	
76	数组变量
77			#mytest=(one two three four five)
78			#echo $mytest //one
79			#echo ${mytest[2]}  //three  
80			#echo ${mytest[*]}  // one two three four five
81			#mytest[2]=seven   //修改某个下标
82			#echo ${mytest[*]}  //one two seven four five
83			#unset mytest[2]
84			#echo ${mytest[*]}  //one two four five  
85			//下表还是保持删除前的
86			#echo  ${mytest[3]}   //four
87			#unset mytest  //删除整个数组

重定向和管道

1.标准输入、标准输出、错误输出

  • linux会为每一个打开的文件分配一个fd(file descriptor,文件描述符)
  • linux提供三种输入输出(I/O)设备
    • 标准输入 (STDIN),0, 默认键盘输入
    • 标准输出 (STDOUT),1,默认输出终端窗口
    • 标准错误输出 (STDERR),2,默认输出终端窗口
  • I/O重定向指改变标准输入、标准输出、标准错误输出的默认位置

2.标准输出、标准错误输出重定向

1> file     <!--将标准输出重定向至file-->
22 > file   <!--将标准错误输出重定向至file-->
3&> file    <!--将标准输出和标准错误输出一起重定向至file-->
1cat /etc/issue /xxx > c.out 2>&1  # 错误输出也输出到 标准输出到位置上
2cat /etc/issue &> d.out   # 和上面是等价到
  • >>>的区别:前者会覆盖文件内容,后者在原有内容后追加

  • set -C禁止覆盖文件操作,set +C允许覆盖文件操作

    • >|强行执行覆盖操作,即使已经set -C状态下也执行
  • 多条命令结果合并重定向(command1 ; command2) > file

  • > linkfile 会将软链接指向的源文件清空,而软链接文件本身不变

3.tr 转换和删除字符

  • 语法:tr [OPTION]... SET1 [SET2]
  • 选项意义:
1-c -C     <!--取SET1字符集的补集-->
2-s        <!--合并连续重复的字符>
3-d        <!--删除SET1字符集中的字符-->
4-t        <!--按顺序位将SET1字符集精确替换成SET2字符集中的字符-->
  • 实验:理解-t选项的意义
1root@ins-ddYvQaGk:~# tr 'abcd' '123'
2aaabbbcccdddeeefff
3111222333333eeefff
4
5root@ins-ddYvQaGk:~# tr -t 'abcd' '123'
6aaabbbcccdddeeefff
7111222333dddeeefff
8
9# 解释:当SET1位数大于SET2时,默认SET1找不到对应位的字符会自动使用SET2最后一位替换;当使用`-t`时,只会精确匹配到SET2的位数,SET1多出的位数不再替换。
1root@ins-ddYvQaGk:~# tr -d 'abc\n'</etc/issue
2Uuntu 18.04.6 LTS \n \lroot@ins-ddYvQaGk:~#      #   ---abc和换行符 都被替换了

4.标准输入重定向

1.从文件输入STDIN,使用<将文件内容重定向为命令的标准输入

1tr 'a-z' 'A-Z' < /etc/issue             <!--将/etc/issue内容中的所有小写字母变为大写输出到终端-->
2tr 'a-z' 'A-Z' < /etc/issue > a.out     <!--将上一个命令的结果重定向输出至文件a.out-->
3tr 'a-z' 'A-Z'  > b.out < /etc/issue    <!--效果与上一命令相同-->

2.使用<< 终止词多行重定向至标准输入

1➜  ~# mail -s help root <<eof
2heredoc> hello, i am `whoami`,
3heredoc> The system version is xxx
4heredoc> thanks!
5heredoc> eof

5.| 管道

  • 语法:command1 | command2 | command3

  • 管道将上一个命令的标准输出传给下一个命令作为标准输入,从而能组合使用多个工具。

  • 标准错误输出无法通过管道传输给下一个命令,需要将上一个命令的标准错误转换为标准输出,再使用管道传输。具体实现可以采用如下两种方式:

    • command1 2>&1 | command2
    • command1 |& command2
  • 管道中的-符号:可以使用-代替管道命令中可能存在的临时文件

1tar -cvf - /home | tar -xvf -     # 将/home文件打包后解包,打包文件是临时文件,用"-"代替 
  • tee 重定向至多个目标
1command1 | tee [-a ] file | command2    # command1的标准输出一方面传输至command2的标准输入,另一方面重定向至文件file 
  • tee命令默认覆盖文件,若要追加内容到文件,增加-a选项

文件查找

1.文件非实时查找 locate

安装:

1yum -y install mlocate

locate查询系统预建文件索引数据库/var/lib/mlocate/mlocate.db,所以查询速度很快

由于数据库不能实时更新文件变动,所以locate可能查询不到新建立、修改的文件

文件索引构建更新为周期任务,文件遍历过程非常消耗系统资源,一般在系统空闲时进行,手动更新使用命令updatedb

属于模糊查找,查找结果是文件的全路径,可能只能搜索到用户具有读取和可执行权限的目录

1语法:locate [option] keyword
2选项:
3-i           //不区分大小写搜索
4-n #         //只显示前#行匹配结果
5-r regex     //搜索符合正则表达式描述的文件

2. 文件实时查找 find

通过遍历指定目录实时查找文件,属于精确查找,所以速度较慢,同样可能只能搜索到用户具有读取和可执行权限的目录

2.1.语法:

find [option] [查找路径] [查找条件] [处理动作]

查找路径:指定具体目标路径;默认为当前目录

查找条件:指定查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件

处理动作:对符合条件的文件做操作,默认输出至屏幕

2.2.查找条件详述

  1. 指定搜索层级
  • -maxdepthlevel //最大搜索目录深度,指定目录为第1级
  • -mindepthlevel //最小搜索目录深度
  1. 根据文件名和inode查找
  • -name //文件名称:支持使用glob(通配符)
  • -iname //文件名称:不区分字母大小写
  • -inum n //按inode号查找
  • -samefile name //相同inode号的文件
  • -links n //链接数为n的文件
  • -regex “PATTERN” //以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称
  1. 根据属主、属组查找
  • -user USERNAME //查找属主为指定用户(UID)的文件
  • -group GRPNAME //查找属组为指定组(GID)的文件
  • -uid UserID //查找属主为指定的UID号的文件
  • -gid GroupID //查找属组为指定的GID号的文件
  • -nouser //查找没有属主的文件
  • -nogroup //查找没有属组的文件
  1. 根据文件类型查找
  • -type f //普通文件
  • -type d //目录文件
  • -type l //符号链接文件
  • -type b //块设备文件
  • -type c //字符设备文件
  1. 组合条件
1  并且 -a
2  或者 -o
3  非 !, -not
4  德摩根定律
5  三种条件的判断先后:“非”优先级最高,“并且”次之,“或者”最低,当不按照此顺序判断时需要增加括号(),注意转义字符
  1. -purne 排除目录

  2. 根据文件大小来查找

1语法:-size [+|-]#UNIT, UNIT: k, M, G
2#UNIT: (#-1, #] UNIT, 如-size 6M   表达的范围为(5, 6]M
3-#UNIT: [0, #-1] UNIT,如-size -6M 表达的范围为[0, 5]M
4+#UNIT: (#, ∞) UNIT,  如-size +6M   表达的范围为(6, ∞)M

查找/etc目录下大小大于1M的普通文件

1    find /etc/ -type f -a -size +1M
  1. 根据时间戳查找
 1语法:
 2以天为单位
 3-atime  [+|-]#
 4-mtime  [+|-]#
 5-ctime  [+|-]#
 6以分钟为单位
 7-amin   [+|-]#
 8-mmin   [+|-]#
 9-cmin   [+|-]#
10范围的意义
11#:  [#,#+1)
12+#: [#+1,∞]
13-#: [0,#)
  1. 根据权限查找
1语法:--perm [/|-] MODE
2MODE 精确匹配权限
3/ MODE 只要u,g,o至少一方的权限与MODE声明匹配,即权限或关系
4-MODE 必须u,g,o都具有MODE声明权限,即权限与的关系
5注意:当使用/或者-时,当MODE声明中存在0,即表明对此位置的权限设置不关注
6 find /app -perm 766   //精确找766权限的 文件
7 find /app -perm /111,代表只要文件的属主、属组、其他人中至少一方有可执行权限即匹配搜索条件
8 find /app -perm -402,代表只有文件属主有读权限、其他人有写权限两个条件同时匹配才能被搜索到,而属组的权限设置搜索过程不关心

2.3.处理动作

1-print 默认动作,搜索结果输出至屏幕
2-ls 对搜索结果执行ls -l命令后的结果
3-delete 删除查找到的文件
4-fls file 将搜索结果的长格式信息保存至文件file
5-ok COMMAND {} \; 对搜索结果执行COMMAND命令,每个搜索文件执行COMMAND命令前有交互式确认,大括号指代搜索结果,命令结尾必须用\;结束
6-exec COMMAND {} \;对搜索结果执行COMMAND命令,命令直接执行没有提示,语法类似-ok

实验:将/app目录下其他人拥有写权限的文件名称增加后缀.bak

1find /app -perm -002 -ok mv {} {}.bak\;

2.4.参数替换 xargs

xargs用于产生某个命令的参数,xargs可以读入stdin的数据,并且以空格符或回车符将stdin的数据分隔成为arguments

有些命令不能接受过多参数,使用xargs可以突破命令的参数数量限制

find与xargs命令结合使用:find | xargs command

实验:将/sbin目录下属主拥有读、写、可执行权限的文件列表用ls -l命令显示出来

1find /sbin -perm -700 | xargs ls -l

3.which 命令

which 命令是根据 PATH这个变量所规范的路径去查询 执行文件的文件名

which -a Print all matching executables in PATH, not just the first.

文本处理工具

文本查看工具

  • cat cat [options] file...
    • option:
    1  -E      显示文本行结束符$
    2  -A     显示所有隐藏字符
    3  -n     每行行首显示行号
    4  -b     只对非空行显示行号
    5  -s     压缩连续空行成一行
    
  • tac 从下至上输出每一行
  • rev 每一行从右至左输出

分页查看文件

  • more

    1  more [options] file...
    2  more -d file 显示翻页、退出提示
    
  • less

    less功能与more相似,增加了向上翻页功能,可以进行文本搜索

显示文本前行、后行内容

  • head 显示文本前行内容

语法:head [OPTION]... [FILE]...

1-c #     指定获取前#字节
2-n #     指定获取前#行
3-#       指定获取前#行
  • tail 显示文本后行内容

语法:tail [OPTION]... [FILE]...

1-c #     指定获取后#字节
2-n #     指定获取后#行
3-#       指定获取后#行
4-f       跟踪显示文件新追加的内容,常用日志监控
1head -9 /etc/fstab | tail -1    #显示/etc/fstab文件的第9行

cut 按列抽取文本

语法:`cut [OPTION]… [FILE]…

1-d      指明分隔符,默认tab
2-f #    第#个字段
3-c      按字符切割
4--output-delimiter=STRING    指定输出分隔符
1# 抽取出df结果第7行的分区和挂载点,分隔符采用”;”
2df | head -7 | tail -1 | tr -s " " | cut -d" " -f1,6 --output-delimiter=";"
3# 抽取出df结果第8行的第9-31个字符(不含空格)
4df | head -8 | tail -1 | tr -d " "  | cut -c9-31

paste 将两个文本同行内容合并为一行

paste [OPTION]... [FILE]...

选项

1-d     指定分隔符,默认tab
2-s    所有行合成一行显示

将/etc/passwd的前8行和/etc/group的前10行同行合并为一行,分隔符为%

1head -8 /etc/passwd > passwd
2head -10 /etc/group > group
3paste -d"%" passwd  group

wc 文本数据统计

  • 语法:wc [options] file

选项

1-l     统计行数
2-w     统计单词数
3-c     统计字节数
4-m     统计字符数

sort 文本排序

语法:sort [options] file

选项

 1-r     执行反方向整理
 2-n     执行按数字大小整理
 3-f     忽略字符串中的字符大小写
 4-u     删除输出中的重复行
 5-t c   使用c做为字段分隔符
 6-k X   按照使用c字符分隔的第X列来排序
 7
 8例子:
 9# sort -n -t: -k3 /etc/passwd  根据uid生序 
10# sort -n -t':' -k3 /etc/passwd  根据uid生序 
11#du -sh * | sort -nr   //降序

uniq 删除重复行

语法:uniq [options] file

选项:

1-c     显示每行重复出现的次数
2        uniq的一个特性,检查重复行的时候,只会检查相邻的行。重复数据,肯定有很多不是相邻在一起的。
3-d     仅显示重复过的行
4-u     仅显示不曾重复的行

统计1.txt;./文本中数字的出现次数,并且数字按照从大到小排列

1sort -nr 1.txt | uniq -c

diff 比较文本文件区别

语法:diff file1 file2

grep 文本搜索工具

 1grep [OPTIONS] PATTERN [FILE...]
 2  常用选项
 3        -n 显示行号
 4        -r 递归 常用组合 -nr 
 5    -v :反向,显示不能被模式所匹配到的行
 6        -c  :  显示匹配多少行
 7    -o :仅显示被模式匹配到的字符,而非整行
 8    -i :不区分字符大小
 9    -A #  //显示匹配行和后面#行
10    -B #  //显示匹配行和前面#行
11    -C #  //上下文匹配 前面和后面的#行    #是数字
12    -E   //支持使用扩展的正则表达式元字符 grep -E =egrep
13    -q     静默模式,不输出任何信息,可以查看$?判断命令是否成功执行
14    -e     实现多个选项间的逻辑or关系
15    -w     匹配整个单词
16    -F     相当于fgrep,不支持正则表达式

文件系统和文件管理

linux文件系统是一个倒置树结构,从”/“开始,文件命名区分大小写,遵循FHS(Filesystem Hierarchy Standard) 标准确保各个发行版拥有统一的目录结构。

执行ls –color=auto,不同类型文件的颜色不同。普通文件为灰色,目录文件为蓝色,可执行文件为绿色,压缩文件为红色,软链接文件为浅蓝色。

1.linux文件系统结构

简要说明如下:

/boot 系统启动文件

/bin 普通用户使用的二进制可执行文件

/sbin 系统管理员使用的二进制可执行文件

/lib 系统启动时需要的库文件和内核模块文件

/lib64 与64位系统有关的库文件

/etc 配置文件

/usr 非常重要的目录,储存可共享并只读的数据

/root 系统管理员的家目录

/home/user_name 普通用户的家目录

/var 经常变化的数据

/media 移动设备挂载点

/mnt 临时挂载点

/dev 设备文件,包含块设备和字符设备

/tmp 临时文件

/proc 内核信息,虚拟文件系统

/sys 硬件信息,虚拟文件系统

在CentOS 7系统中,/lib, /lib64, /bin, /sbin四个目录已经变作软链接,实质上分别与/usr/lib, /usr/lib64, /usr/bin, /usr/sbin四个目录进行了合并,这也从另一个角度凸显/usr目录的重要性。

基名:路径最底层的文件或目录

目录名:路径除基名的剩余部分

1basename /etc/rc.d/rc1.d   
2# rc1.d
3dirname /etc/rc.d/rc1.d     
4#/etc/rc.d

2.pwd 显示当前工作目录

pwd -P print the physical directory, without any symbolic links

3.cd 更改目录

1    cd ..      切换至当前目录的父目录
2    cd -      切换至上一次切换的目录,只能切换一次;功能实现:OLDPWD变量储存上一次切换至的目录,cd -时直接读取$OLDPWD值即可
3    cd ~     切换至当前用户的home目录
4    cd -P 路径      与pwd命令的-P选项类似,切换至真实物理路径

4. ls 列出目录内容

语法:ls [options] [files_or_dirs]

 1ls -a      包含隐藏文件
 2ls -l       显示额外信息
 3ls -lh     文件大小使用K,M,G单位更方便阅读
 4ls -R     递归显示目录下一层内容
 5ls -r       逆序显示
 6ls -i       符号链接信息
 7ls -d      只显示目录信息
 8ls -1     分行显示
 9ls –S    按从大到小排序
10ls –t      按mtime排序
11ls --time=atime 按atime排序
12
13
14文件类型:
15“-“为普通文件
16“d”目录文件
17“b”块设备文件
18“c”字符设备文件
19“l”符号链接文件
20“p”管道文件
21“s”套接字文件

5.stat 查看文件状态

使用stat命令主要显示文件的元数据(metadata)

文件的三个时间戳信息:

  • atime(acess time) 访问时间,文件被读取视作访问;

  • mtime(modify time) 修改时间 ,文件数据被修改视作修改;

  • ctime(change time) 改变时间, 文件元数据被修改视作改变。

  • 由于文件读取属于经常性操作,频繁修改atime会降低系统性能,也没有实际意义。所以实际上atime每24h更新一次, 或当ctime比atime更新时主动进行更新。

6.glob 文件通配符

 1*匹配零个或多个字符
 2?匹配任何单个字符
 3~ 当前用户家目录
 4~mage 用户mage家目录
 5~+ 当前工作目录
 6~- 前一个工作目录
 7[0-9]匹配数字范围
 8[a-z]:字母
 9[A-Z]:字母
10[wang]匹配列表中的任何的一个字符
11[^wang]匹配列表中的所有字符以外的字符
12[:digit:]:任意数字,相当于0-9
13[:lower:]:任意小写字母
14
15[:alnum:]:任意数字或字母
16[:blank:]:水平空白字符
17[:space:]:水平或垂直空白字符
18[:punct:]:标点符号
19[:print:]:可打印字符
20[:cntrl:]:控制(非打印)字符
21[:graph:]:图形字符
22[:xdigit:]:十六进制字符
23注意:
24
25[0-9],[a-z],[A-Z]三个通配符里面的数字或字母不能倒叙写成[9-0],[z-a],[Z-a],会报错;
26
27[a-z]指{a,A,b,B…y,Y,z}中的一个字母,[A-Z]指{A,b,B…Y,z,Z}中的一个字母,如果想要表示所有字母中的一个字母,建议使用下面提到的预定义字符类。

7.touch 创建空文件、刷新时间戳

若文件名不存在,则创建空文件;若文件名已存在,则刷新此文件的时间戳。

1touch [OPTION]... FILE...
2-a     仅改变atime和ctime
3-m    仅改变mtime和ctime
4-t  [[CC]YY]MMDDhhmm[.ss]     指定atime和mtime的时间戳
5-c     如果文件不存在,则不予创建

8. cp 复制文件和目录

语法: cp [OPTION]… SOURCE DEST

 1-i     覆盖前提示
 2-n     不覆盖
 3-r, -R     递归复制目录及内部的所有内容
 4-a     归档,相当于-dR --preserv=all
 5-d     不复制原文件,只复制链接名
 6--preserv[=ATTR_LIST]   <!--保留属性——mode:权限,ownership:属主属组,timestamp:时间戳,links:链接,
 7        xattr,context,all-->
 8-P   不复制软链接指向的文件,指复制软链接文件本身
 9-p     preserv=mode,ownership,timestamp,保留权限、所有者、时间戳信息
10-v     显示操作过程
11-f     强制,如果已经存在的目标文件不能成功打开,删除它并重复cp操作

9.mv 移动和重命名文件

语法:mv [OPTION]… [-T] SOURCE DEST

当SOURCE与DEST在同一个目录下时,表明将文件名从SOURCE改为DEST

批量修改文件名 rename

rename ‘.txt’ ‘.txt.bak’ *.txt

10. rm 删除——危险命令

语法:rm[OPTION]… FILE…

选项:

-i 交互式提示

-r 递归删除

-f 强制删除不提示

11. 目录相关操作

tree 显示目录树

  • -d 只显示目录
  • -L level 指定显示的层级数目

mkdir 创建目录

  • -p 一次性创建多层目录

  • -v 显示详细信息

rmdir 删除空目录

  • -p: 递归删除父空目录
  • -v: 显示详细信息
  • 删除有内容的目录时不能用rmdir,使用rm -r递归删除目录和文件

12. 索引节点(index node)

一个索引节点包含一个文件的所有元数据信息,所有索引节点构建的索引节点表涵盖分区内所有文件的元数据信息。

文件名引用一个索引节点号,通过查询索引节点表查询到文件数据存放位置。

目录包含目录下文件索引节点与文件名称的映射信息,所以目录下新增、删除文件都会对目录进行修改。

cp命令分配一个空闲索引节点,将新建文件与该索引节点进行映射

rm命令删除文件与其索引节点的映射从而释放索引节点,但并不立即删除数据。

mv命令:

功能为移动时,相当于cp和rm操作

功能为重命名时,删除旧文件名与索引节点的映射,建立新文件名与索引节点的映射,期间索引节点没有变化(除时间戳)。

分区挂载点inode编码规则:/proc /sys 虚拟分区为1,其他分区挂载点在CentOS 6下从2开始,在CentOS 7下从64开始。

13. ln 硬链接与软链接

ln 创建硬链接

ln-s 创建软连接

本质:硬链接本质上是同一个文件,只是一个文件具有两个名字,彼此之间是平等的关系,节点号相同;

软连接本质上不是同一个文件,节点号不同,相当于windows里面的快捷方式。

区别:

  • 1.硬链接不允许对目录创建,软连接可以,如果要想使目录的链接数增加,可以在当前目录内创建多个子目录来实现;
  • 2.硬链接不允许跨分区,软链接可以;
  • 3.创建硬链接后连接数加1,软链接链接数不增长;
  • 4.删除硬链接后互相不影响,删除软连接源文件后,软连接就失效了;
  • 5.硬链接文件的大小和属性完全相同,软链接大小、属性和源文件不同,软链接的大小由源文件的名的字符多少决定;
  • 6.软链接的相对路径不是相对于当前工作目录,而是相对于软连接的当前工作目录,硬链接相对于当前工作目录和相对于硬链接的工作目录都可以。

inode详解见http://www.cnblogs.com/adforce/p/3522433.html

14. file 查看文件类型

file命令通过读取文件前部内容(Magic Number)确定文件类型。

hexdump -C以十六进制查看可执行文件