linux中bash shell及文件管理

bash shell特性

  1. 什么是bash shell
    bash shell 是命令解释器,存在于linux操作系统的最外层,负责将用户输入的命令翻译给操作系统内核进行执行的接口。
  2. bash shell的执行流程
    1)判断命令是否通过绝对路径进行执行
    2)判断命令是否有alias别名
    3)判断命令是内部命令还是外部命令
    4)如果是内部命令直接执行,外部命令查找是否有hash缓存
    5)如果没有hash缓存,通过PATH路径进行查找
  3. 什么是内部命令,什么是外部命令
    1)内部命令:shell程序自带的命令
    2)外部命令:在系统PATH变量中某个路径下的可执行程序
  4. 如何检查输入的命令是外部命令还是内部命令
    使用type -a 命令来查看
#cd命令属于shell内部命令
[root@localhost ~]$ type -a cd
cd is a shell builtin
cd is /usr/bin/cd

#ping属于外部命令, 同时会打印当前命令路径
[root@localhost ~]$ type -a  ping
ping is /bin/ping
  1. PATH环境变量
    1)PATH由多个路径组成,每个路径值之间用冒号间隔,对这些路径的增加和删除操作都将影响到Bash解释器对Linux命令的查找
    2)使用echo $PATH查看系统的环境变量
[root@localhost.localdomain /]$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
  1. 如果是外部命令,执行完命令将缓存在hash中,下次执行的时候将通过缓存调取执行,不会查找PATH变量,如果hash中存在命令缓存,此时将命令移动到其他PATH变量中存在的目录中,命令执行将会报找不到这个命令的错误,使用hash -r清除缓存记录,系统将会通过PATH变量找到该命令。
[root@localhost.localdomain ~]$ hash  # hash中存在free命令路径
hits    command
   1    /usr/bin/ls
   1    /usr/bin/free

[root@localhost.localdomain ~]$ free   #执行free成功,从hash中查找free命令
              total        used        free      shared  buff/cache   available
Mem:         995748      195612      386500        7688      413636      645016
Swap:       1048572           0     1048572

[root@localhost.localdomain ~]$ mv /usr/bin/free /sbin   #将free移动位置

[root@localhost.localdomain ~]$ free
-bash: /usr/bin/free: No such file or directory  #报错,hash缓存中/usr/bin/找不到free

[root@localhost.localdomain ~]$ hash -r  #清除hash表

[root@localhost.localdomain ~]$ free   #执行free成功,从PATH变量中查找free
              total        used        free      shared  buff/cache   available
Mem:         995748      195588      386524        7688      413636      645040
Swap:       1048572           0     1048572

  1. alias命令
    查看系统别名以及创建别名
[root@localhost.localdomain ~]$ alias   # alias查看系统中存在的别名
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias grep='grep --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'

[root@localhost.localdomain ~]$ alias free="free -h"    #临时创建别名

[root@localhost.localdomain ~]$ alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias free='free -h'
alias grep='grep --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'

[root@localhost.localdomain ~]$ free
              total        used        free      shared  buff/cache   available
Mem:           972M        190M        377M        7.5M        403M        630M
Swap:          1.0G          0B        1.0G
  1. ls 命令
    查看目录以及文件信息
[root@localhost.localdomain /]$ ls     #查看当前目录下的内容
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

[root@localhost.localdomain /]$ ls -a    # -a查看当前目录下的所有内容(隐藏文件)
.  ..  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

[root@localhost.localdomain /]$ ls -l /tmp    # -l查看/tmp目录下内容的详细信息
total 4
-rwx------. 1 root root 836 Oct 19 10:24 ks-script-LKdnj5
drwx------. 3 root root  17 Oct 19 10:29 systemd-private-73db8943d3c34b968d054a5527d3f835-chronyd.service-Ybtxup
drwx------. 2 root root   6 Oct 19 10:29 vmware-root_572-2999067484
-rw-------. 1 root root   0 Oct 19 10:20 yum.log

[root@localhost.localdomain /]$ ls -lh    # -h将文件大小使用KB、GB、MB的方式展示
total 16K
lrwxrwxrwx.   1 root root    7 Oct 19 10:20 bin -> usr/bin
dr-xr-xr-x.   5 root root 4.0K Oct 19 10:24 boot
drwxr-xr-x.  18 root root 3.0K Oct 19 10:29 dev
drwxr-xr-x.  75 root root 8.0K Oct 20 11:13 etc

[root@localhost.localdomain /]$ ls -dl /    # -d展示目录本身的信息,不展示目录里面的内容
dr-xr-xr-x. 17 root root 224 Oct 19 10:24 /

文件管理

  1. 系统的目录结构
[root@localhost.localdomain /]$ ls 
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
1、/bin: 是/usr/bin的软连接,主要存放一些普通用户可以执行的命令文件
2、/boot: 主要存放系统启动时所需要的文件(内核、Grup引导文件等等)
3、/dev: 主要存放一些硬件文件(磁盘,键盘等)
4、/etc: 主要存放的是系统的配置文件
5、/home: 普通用户的家目录
6、/lib和/lib64: 是/usr/lib和/usr/lib64的软链接,主要存在的是命令执行时所需要的库文件
7、/media和/mnt: 挂载目录
8、/opt: 额外软件包的安装目录
9、/proc: 反应系统进程的实时状态的目录(存放关于正在执行的进程状态文件、内存状态文件等)
10、/root: root用户的家目录
11、/sbin: 是/usr/sbin的软链接,主要存放一些root用户才能执行的命令文件
12、/tmp: 临时文件夹
13、/usr: 相当于windows中的C:\Windows文件,主要是一些系统文件
14、/var: 主要存放的是一些日志文件
  1. cd命令
    切换目录
[root@localhost.localdomain /]$ cd /etc    #切换到指定的目录
[root@localhost.localdomain /etc]$ cd -    #切换到上一次所在的目录
/
[root@localhost.localdomain /]$ cd        #切换到当前用户的家目录
[root@localhost.localdomain ~]$ cd .     #切换到当前目录
[root@localhost.localdomain ~]$ cd ..    #切换到上一级目录
[root@localhost.localdomain /]$ 
  1. touch命令
    如果文件存在,则修改文件的时间,如果文件不存在,则创建文件
[root@localhost.localdomain ~]$ touch file1.txt   #创建文件file1.txt
[root@localhost.localdomain ~]$ ls
anaconda-ks.cfg  file1.txt
[root@localhost.localdomain ~]$ touch file{a,b}.txt    #创建文件filea.txt  fileb.txt
[root@localhost.localdomain ~]$ ls
anaconda-ks.cfg  file1.txt  filea.txt  fileb.txt
[root@localhost.localdomain ~]$ touch file{2..5}.txt    #创建文件 file2.txt  file3.txt  file4.txt  file5.txt
[root@localhost.localdomain ~]$ ls
anaconda-ks.cfg  file1.txt  file2.txt  file3.txt  file4.txt  file5.txt  filea.txt  fileb.txt
[root@localhost.localdomain ~]$ touch filec.txt filed.txt       #创建文件filec.txt  filed.txt
[root@localhost.localdomain ~]$ ls
anaconda-ks.cfg  file1.txt  file2.txt  file3.txt  file4.txt  file5.txt  filea.txt  fileb.txt  filec.txt  filed.txt
  1. mkdir命令
    创建目录,选项:-v 显示详情 -p递归创建
[root@localhost.localdomain ~]$ mkdir test1    #创建目录test1
[root@localhost.localdomain ~]$ ls
anaconda-ks.cfg  test1
[root@localhost.localdomain ~]$ mkdir -p test2/test3   #递归创建目录./test2/test3
[root@localhost.localdomain ~]$ ls
anaconda-ks.cfg  test1  test2
[root@localhost.localdomain ~]$ mkdir -v test4     #创建test4目录并显示详细信息
mkdir: created directory ‘test4’
[root@localhost.localdomain ~]$ mkdir -pv test2/test{4..6}      #递归创建./test2/test{4..6} 并显示详细信息
mkdir: created directory ‘test2/test4’
mkdir: created directory ‘test2/test5’
mkdir: created directory ‘test2/test6’
  1. tree命令
    以树状结构显示目录,选项:-L 1 显示一层,-d 只显示目录
[root@localhost.localdomain ~]$ tree    #以树状结构显示当前目录里的所有内容
.
├── anaconda-ks.cfg
├── test1
├── test2
│   ├── test3
│   ├── test4
│   ├── test5
│   └── test6
└── test4
7 directories, 1 file

[root@localhost.localdomain ~]$ tree -d   #以树状结构显示当前目录里的目录内容
.
├── test1
├── test2
│   ├── test3
│   ├── test4
│   ├── test5
│   └── test6
└── test4
7 directories

[root@localhost.localdomain ~]$ tree -L 1  #以树状结构显示当前目录里的第一层内容
.
├── anaconda-ks.cfg
├── test1
├── test2
└── test4
3 directories, 1 file
  1. cp命令
    复制文件,选项:-v 显示详情 -r 递归复制
[root@localhost.localdomain ~]$ cp -vr ./test1 /tmp   #将./test1目录复制到/tmp中并显示详细信息
‘./test1’ -> ‘/tmp/test1’
[root@localhost.localdomain ~]$ cp -vr ./test1 /tmp/test2    #将./test1目录复制到/tmp中并改名为test2。
‘./test1’ -> ‘/tmp/test2’
  1. mv命令
    移动文件,注意:递归移动不需要加参数
[root@localhost.localdomain ~]$ mv test1 test3   #原地移动文件相当于改名

[root@localhost.localdomain ~]$ mv ./test4 /tmp   #将./test4文件移动到./tmp下

[root@localhost.localdomain ~]$ mv ./test3 /tmp/test5   #将./test3移动到/tmp下并改名为test5
  1. rm命令
    删除文件,选项:-r 递归删除 -f 强制删除 -v 显示详情
[root@localhost.localdomain ~]$ rm file1.txt   #删除文件, 默认rm存在alias别名,rm -i所以会提醒是否删除文件
rm: remove regular empty file ‘file1.txt’? y

[root@localhost.localdomain ~]$ rm -f file2.txt    #删除文件, 不提醒
[root@localhost.localdomain ~]$ rm -f test2     #不加-r,无法删除目录
rm: cannot remove ‘test2’: Is a directory
[root@localhost.localdomain ~]$ rm -rf test2   #强制删除目录,不提醒(慎用)
  1. cat命令
    查看文件内容 选项:-n 显示行数 -A 显示文件中的(tab、结尾$)
[root@localhost.localdomain ~]$ cat >>file3.txt<<eof    #交互式追加文件内容
> asdfasfas  fasdfafas
> sfsfsddf
>   sdfsdfgsd sfdfsd
> eof
[root@localhost.localdomain ~]$ cat file3.txt     #查看file3.txt文件
asdfasfas  fasdfafas
sfsfsddf
  sdfsdfgsd sfdfsd
[root@localhost.localdomain ~]$ cat -n file3.txt    #-n查看file3.txt文件并显示行号
     1  asdfasfas  fasdfafas
     2  sfsfsddf
     3    sdfsdfgsd sfdfsd
[root@localhost.localdomain ~]$ cat -A file3.txt  #查看file3.txt文件并显示制表符以及结尾$
asdfasfas  fasdfafas$
sfsfsddf$
  sdfsdfgsd sfdfsd$
  1. more/less命令
    以翻页的形式显示文件内容
  2. head命令
    默认显示文件前十行的内容 选项: -n 5 显示前五行
[root@localhost.localdomain ~]$ head /etc/passwd   # 默认显示前十行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

[root@localhost.localdomain ~]$ head -n 5 /etc/passwd   # 显示前五行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  1. tail 命令
    默认显示文件后十行的内容
[root@localhost.localdomain ~]$ tail /etc/passwd     #默认显示文件后10行的内容
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
hax:x:1000:1000::/home/hax:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

[root@localhost.localdomain ~]$ tail -5 /etc/passwd     #显示文件后五行
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
hax:x:1000:1000::/home/hax:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

[root@localhost.localdomain ~]$ tail -f /etc/passwd    #-f查看文件尾部的变化
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
hax:x:1000:1000::/home/hax:/bin/bash
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
  1. grep命令
    文本搜索命令
[root@localhost.localdomain ~]$ grep root /etc/passwd   # 筛选包含root的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

[root@localhost.localdomain ~]$ grep ^root /etc/passwd   #筛选以root开头的行
root:x:0:0:root:/root:/bin/bash

[root@localhost.localdomain ~]$ grep bash$ /etc/passwd   #筛选以bash结尾的行
root:x:0:0:root:/root:/bin/bash
hax:x:1000:1000::/home/hax:/bin/bash

[root@localhost.localdomain ~]$ grep -i ftp /etc/passwd   #  -i  忽略ftp大小写
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

[root@localhost.localdomain ~]$ grep -Ei "sync$|ftp" /etc/passwd   #  -E匹配时可以使用元字符匹配,相当于egrep
sync:x:5:0:sync:/sbin:/bin/sync
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

[root@localhost.localdomain ~]$ grep -n -A 2 ftp /etc/passwd   # -n 显示行号  -A 2  匹配ftp行内容并打印后两行
12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13-nobody:x:99:99:Nobody:/:/sbin/nologin
14-systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin

[root@localhost.localdomain ~]$ grep -n -B 2 ftp /etc/passwd   # -n 显示行号  -B 2  匹配ftp行内容并打印前两行
10-operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

[root@localhost.localdomain ~]$ grep -n -C 2 ftp /etc/passwd    # -n 显示行号  -C 2  匹配ftp行内容并打印前后各两行
10-operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13-nobody:x:99:99:Nobody:/:/sbin/nologin
14-systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin

[root@localhost.localdomain ~]$ grep -v sfsfsdd file3.txt   #除了含sfsfsdd内容的都显示出来
asdfasfas  fasdfafas
  sdfsdfgsd sfdfsd
  1. wget/curl命令
    联网下载文件, wget:选项 -O 指定下载位置 curl 选项: -o 指定下载位置
#使用wget命令要安装wget
yum install -y wget
[root@localhost.localdomain ~]$ wget http://mirrors.aliyun.com/repo/Centos-7.repo    #将文件下载到本地

[root@localhost.localdomain ~]$ wget -O ./centostest http://mirrors.aliyun.com/repo/Centos-7.repo   #将文件下载到指定目录并改名为centostest

[root@localhost.localdomain ~]$ curl http://mirrors.aliyun.com/repo/Centos-7.repo   #显示网络文件的内容(不下载)

[root@localhost.localdomain ~]$ curl -o ./centostest1 http://mirrors.aliyun.com/repo/Centos-7.repo   #下载网络文件到指定的目录并改名
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2523  100  2523    0     0   9759      0 --:--:-- --:--:-- --:--:--  9741
  1. 修改yum源地址
    进入到/etc/yum.repos.d目录中,备份CentOS-Base.repo文件,执行wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo命令修改yum源地址为阿里云yum地址
  2. rz/sz 命令
    rz : 上传文件到linux中
    sz: 从linux中下载文件
    使用rz/sz命令需要安装lrzsz软件,使用yum install -y lrzsz命令下载软件
rz              #上传文件到linux当前目录中
sz /path/file     #下载/path/file文件到Windows中
  1. which/whereis/type -a 命令
    命令查找命令
[root@localhost.localdomain ~]$ which ls
alias ls='ls --color=auto'
    /usr/bin/ls
[root@localhost.localdomain ~]$ type -a ls
ls is aliased to `ls --color=auto'
ls is /usr/bin/ls
[root@localhost.localdomain ~]$ whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz
  1. sort命令
    内容排序,选项:-n 按照数字排序,-t 指定分隔符 -k指定第几列(1,2)指定第几列的第几个字符(1.1,1.3), -r 倒序
# 先按照第三个字段开始到第三个字段结束排序,再按照第四个字段的第一个字符开始到第三个字符结束进行排序
[root@localhost.localdomain ~]$ sort -t "." -k3,3 -k4.1,4.3 -n ip.txt
192.168.0.151 00:0F:AF:85:6C:F6
192.168.0.151 00:0F:AF:85:6C:F6
192.168.0.152 00:0F:AF:83:1F:65
192.168.0.153 00:0F:AF:85:70:03
192.168.0.153 00:0F:AF:85:70:03
192.168.1.1 00:0F:AF:81:19:1F
192.168.1.10 00:30:15:A2:3B:B6
192.168.1.11 00:30:15:A3:23:B7
192.168.1.11 00:30:15:A3:23:B7
192.168.1.12 00:30:15:A2:3A:A1
192.168.1.21 00:0F:AF:85:6C:09
192.168.1.152 00:0F:AF:83:1F:65
192.168.2.2 00:0F:AF:85:6C:25
192.168.2.20 00:0F:AF:85:55:DE
192.168.2.20 00:0F:AF:85:55:DE
192.168.2.21 00:0F:AF:85:6C:09
192.168.2.22 00:0F:AF:85:5C:41
192.168.2.22 00:0F:AF:85:5C:41
192.168.3.1 00:0F:AF:81:19:1F
192.168.3.2 00:0F:AF:85:6C:25
192.168.3.3 00:0F:AF:85:70:42
192.168.3.3 00:0F:AF:85:70:42
192.168.3.10 00:30:15:A2:3B:B6
192.168.3.12 00:30:15:A2:3A:A1

  1. uniq 命令
    去重统计命令 选项:-c 计算重复的的行的数量
# 统计出ip出现的次数并排序
[root@localhost.localdomain ~]$ sort -t "." -k3,3 -k4.1,4.3 -n ip.txt|uniq -c|sort -nr
      2 192.168.3.3 00:0F:AF:85:70:42
      2 192.168.2.22 00:0F:AF:85:5C:41
      2 192.168.2.20 00:0F:AF:85:55:DE
      2 192.168.1.11 00:30:15:A3:23:B7
      2 192.168.0.153 00:0F:AF:85:70:03
      2 192.168.0.151 00:0F:AF:85:6C:F6
      1 192.168.3.2 00:0F:AF:85:6C:25
      1 192.168.3.12 00:30:15:A2:3A:A1
      1 192.168.3.1 00:0F:AF:81:19:1F
      1 192.168.3.10 00:30:15:A2:3B:B6
      1 192.168.2.21 00:0F:AF:85:6C:09
      1 192.168.2.2 00:0F:AF:85:6C:25
      1 192.168.1.21 00:0F:AF:85:6C:09
      1 192.168.1.152 00:0F:AF:83:1F:65
      1 192.168.1.12 00:30:15:A2:3A:A1
      1 192.168.1.1 00:0F:AF:81:19:1F
      1 192.168.1.10 00:30:15:A2:3B:B6
      1 192.168.0.152 00:0F:AF:83:1F:65
  1. cut命令
    截取字段至标准输出, 选项: -b 以字节为单位进行截取 -c 以字符为单位进行截取 -d 指定分割符(默认tab) -f 与-d一起使用,指定显示那个区域 -n 取消分割多字节字符,与-b一起使用
截取ip.txt文件中以.为分隔符的第二个字段
[root@localhost.localdomain ~]$ cut -d "." -f 2 ip.txt 
168
168
168
168
168
168
168
168
168

[root@localhost.localdomain ~]$ awk -F "." '{print $2}' ip.txt   # awk -F 指定分割符  {print $2}打印第二个字段
168
168
168
168
168
168
168
168
168
  1. wc命令
    统计行号 选项: -l 统计文件行数
[root@localhost.localdomain ~]$ wc -l ip.txt    
24 ip.txt    
  1. sed命令
    主要功能是对行内容进行替换,次要功能取某一行的行内容,选项:-n 取消默认输出; '2p'取第二行, -i 不输出内容,直接修改文件; 's###g'替换内容;-r 使用高级正则表达式
[root@localhost.localdomain ~]$ ifconfig ens32
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.200.30  netmask 255.255.255.0  broadcast 192.168.200.255
        inet6 fe80::47d:77d6:ae20:9620  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:a2:43:18  txqueuelen 1000  (Ethernet)
        RX packets 124182  bytes 127905228 (121.9 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 43096  bytes 9312317 (8.8 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@localhost.localdomain ~]$ ifconfig ens32|sed -n '2p'      # 取出ifconfig ens32的第二行
        inet 192.168.200.30  netmask 255.255.255.0  broadcast 192.168.200.255

[root@localhost.localdomain ~]$ ifconfig ens32|sed -n '2,3p'    # 取出ifconfig ens32的第二行和第三行
        inet 192.168.200.30  netmask 255.255.255.0  broadcast 192.168.200.255
        inet6 fe80::47d:77d6:ae20:9620  prefixlen 64  scopeid 0x20<link>

[root@localhost.localdomain ~]$ sed '2s#www#hhh#g' web.log    # 将第二行的www替换为hhh(没有真正的替换,只是输出到屏幕)
http://www.xuliangwei.com/index.html
http://hhh.xuliangwei.com/1.html
http://post.xuliangwei.com/index.html
http://mp3.xuliangwei.com/index.html
http://www.xuliangwei.com/3.html
http://post.xuliangwei.com/2.html

[root@localhost.localdomain ~]$ sed -i '2s#www#hhh#g' web.log   #  -i 将替换的内容保存到文件中

[root@localhost.localdomain ~]$ ifconfig ens32|sed -n 2p|sed -r 's#^.*net (.*) net.*$#\1#g'
192.168.200.30 

  1. 取出web.log文件中的域名并统计排序
[root@localhost.localdomain ~]$ cat web.log 
http://www.xuliangwei.com/index.html
http://www.xuliangwei.com/1.html
http://post.xuliangwei.com/index.html
http://mp3.xuliangwei.com/index.html
http://www.xuliangwei.com/3.html
http://post.xuliangwei.com/2.html

[root@localhost.localdomain ~]$ awk -F '/' '{print $3}' web.log |sort|uniq -c| sort -nr
      3 www.xuliangwei.com
      2 post.xuliangwei.com
      1 mp3.xuliangwei.com
  1. 取出iifconfig中的ip地址
[root@localhost.localdomain ~]$ ifconfig ens32
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.200.30  netmask 255.255.255.0  broadcast 192.168.200.255
        inet6 fe80::47d:77d6:ae20:9620  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:a2:43:18  txqueuelen 1000  (Ethernet)
        RX packets 123598  bytes 127853467 (121.9 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 42743  bytes 9271887 (8.8 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@localhost.localdomain ~]$ ifconfig ens32|grep 'inet '|awk '{print $2}'
192.168.200.30
[root@localhost.localdomain ~]$ ifconfig ens32|sed -n '2p'|awk '{print $2}'
192.168.200.30
[root@localhost.localdomain ~]$ ifconfig ens32|sed -nr '2s#^.*net (.*) net.*$#\1#gp'
192.168.200.30
[root@localhost.localdomain ~]$ ifconfig ens32|awk 'NR==2 {print $2}'  
192.168.200.30
[root@localhost.localdomain ~]$ ifconfig ens32|awk '/broadcast/ {print $2}'
192.168.200.30
  1. 修改/etc/selinux/config 中SELINUX=enforcing为SELINUX=disable
[root@localhost.localdomain /etc/selinux]$ cat config 

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted 

[root@localhost.localdomain /etc/selinux]$ sed -i '/^SELINUX=/s#enforcing#disable#g' config
  1. 系统文件类型
-   普通文件(文本, 二进制, 压缩, 图片, 日志等) 
d   目录文件
b   设备文件(块设备)存储设备硬盘 /dev/sda1, /dev/sda2
c   设备文件(字符设备),终端 /dev/tty1, /dev/zero
s   套接字文件, 进程间通信(socket)
p   管道文件
l   链接文件
  1. 查看普通文件的详细类型(file命令)
[root@localhost.localdomain ~]$ file /etc/hosts
/etc/hosts: ASCII text

[root@localhost.localdomain ~]$ file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=aa7ff68f13de25936a098016243ce57c3c982e06, stripped

[root@localhost.localdomain ~]$ file /dev/sda
/dev/sda: block special

[root@localhost.localdomain ~]$ file /dev/tty1
/dev/tty1: character special
  1. 系统链接文件
    文件有文件名与数据,在Linux上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方,我们将其称为Block元数据,即文件的附加属性,如文件大小、创建时间、所有者等信息。我们称其为Inode在Linux中,inode是文件元数据的一部分但其并不包含文件名,inode号即索引节点号)文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。
  2. 什么是软链接
    软链接相当于Windows的快捷方式,软链接文件会将inode指向源文件的block,当我们访问这个软链接文件时,其实访问的是源文件本身。那么当我们对一个文件创建多个软链接,其实就是多个inode指向同一个block。当我们删除软链接文件时,其实只是删除了一个inode指向,并不会对源文件源文件造成影响,但如果删除的是源文件则会造成所有软链接文件失效。
[root@localhost.localdomain ~]# ln -s test.txt test    # 给test.txt创建一个软链接test
[root@localhost.localdomain ~]# ll
lrwxrwxrwx. 1 root root    8 Oct 22 18:09 test -> test.txt
-rw-r--r--. 1 root root    0 Oct 22 18:09 test.txt
  1. 什么是硬链接
    若一个inode号对应多个文件名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多个别名,删除其中一个文件只是相当于删除了文件的别名,并没有删除文件inode和block本身
[root@localhost.localdomain ~]# ln test.txt test_hard.txt   # 给test.txt创建硬链接test_hard.txt
[root@localhost.localdomain ~]# ll
lrwxrwxrwx. 1 root root    8 Oct 22 18:09 test -> test.txt
-rw-r--r--. 2 root root    0 Oct 22 18:09 test_hard.txt     # 在详情中看到硬链接数为2
-rw-r--r--. 2 root root    0 Oct 22 18:09 test.txt
  1. 为什么创建的空目录有2个硬链接
[root@localhost.localdomain ~]# ll -di 2
34346745 drwxr-xr-x. 2 root root 6 Oct 22 18:27 2

[root@localhost.localdomain ~]# cd 2

[root@localhost.localdomain ~/2]# ll -ai
total 4
34346745 drwxr-xr-x. 2 root root    6 Oct 22 18:27 .     #  .  这个目录是这个目录的硬链接
67147841 dr-xr-x---. 4 root root 4096 Oct 22 18:27 ..   # ..  这个目录是上一级目录的硬链接
  1. 硬链接与软链接区别
    1)ln命令创建硬链接,ln -s命令创建软链接。
    2)目录不能创建硬链接,并且硬链接不可以跨越分区系统。
    3)目录软链接特别常用,并且软链接支持跨越分区系统。
    4)硬链接文件与源文件的inode相同,软链接文件与源文件inode不同。
    5)删除软链接文件,对源文件及硬链接文件无任何影响。
    6)删除文件的硬链接文件,对源文件及链接文件无任何影响。
    7)删除链接文件的源文件,对硬链接无影响,会导致软链接失效。
    8)删除源文件及其硬链接文件,整个文件会被真正的删除。

32.vim编辑器

普通模式:
1.命令光标跳转
G       #光标跳转至末端
gg      #光标跳转至顶端
Ngg     #光标跳转至当前文件内的N行
$       #光标跳转至当前光标所在行的尾部
^|0     #光标跳转至当前光标所在行的首部
-------------------------------------------
2.文件内容较多
ctrl+f  #往下翻页(行比较多)
ctrl+b  #往上翻页
-------------------------------------------
3.复制与粘贴
yy      #复制当前光标所在的行
5yy     #复制当前光标以及光标向下4行
 
p   #粘贴至当前光标下一行   
-------------------------------------------
4.删除、剪贴、撤销  
dd      #删除当前光标所在的行   
4dd     #删除当前光标所在的行以及往下的3行
dG      #删除当前光标以后的所有行
u       #撤销上一次的操作
-------------------------------------------
编辑模式:
i   #进入编辑模式,光标不做任何操作
a   #进入编辑模式,将当前光标往后一位
o   #进入编辑模式,并在当前光标下添加一行空白内容
-------------------------------------------
命令行模式:
1.文件保存与退出
:w      保存当前状态
:w!     强制保存当前状态
:q      退出当前文档(文档必须保存才能退出)
:q!     强制退出文档不会修改当前内容
:wq     先保存,在退出
:wq!    强制保存并退出
ZZ      保存退出, shfit+zz
:number 跳转至对应的行号
-------------------------------------------
2.文件内容查找
/string #需要搜索的内容(查找)
n       #按搜索到的内容依次往下进行查找
N       #按搜索到的内容依次往上进行查找
-------------------------------------------
3.文件内容替换
:1,5s#sbin#test#g   #替换1-5行中包含sbin的内容为test
:%s#sbin#test#g     #替换整个文本文件中包含sbin的替换为test
:%s#sbin#test#gc    #替换内容时时提示是否需要替换
-------------------------------------------
4.文件内容另存
:w /root/test.txt  #将所有内容另存为/root/test.txt文件中
-------------------------------------------
视图模式:
ctrl+v  进入可视块模式,选中需要注释的行
    1.插入:按shift+i进入编辑模式,输入#,结束按ESC键
    2.删除:选中内容后,按x或者d键删除
    3.替换:选中需要替换的内容, 按下r键,然后输入替换后的内容
-------------------------------------------
shift+v 进入可视行模式,选中整行内容
    1.复制:选中行内容后按y键及可复制。
    2.删除:选中行内容后按d键删除
-------------------------------------------
VIM扩展
:set nu             #显示行号
:set ic             #忽略大小写, 在搜索的时候有用
:set list           #显示制表符(空行、tab键)
-------------------------------------------
  1. vim环境变量设置
    ~/.vimrc 个人环境变量 /etc/vimrc 全局环境变量
# vim  ~/.vimrc #当下次再打开文件自动显示行号并忽略大小写
set nu
set ic

#如果个人vim环境没有配置, 则使用全局vim环境变量配置。
#如果个人vim环境和全局环境变量产生冲突, 优先使用个人vim环境变量。
  1. 相同文件之间差异对比,通常用于对比修改前后差异
vimdiff   #以vim方式打开两个文件对比,高亮显示不同的内容
  1. 如果VIM非正常退出 (ctrl+z)挂起或强制退出终端没关闭VIM后
# 假设打开filename文件被以外关闭,需要删除同文件名的.swp文件即可解决
# rm -f .filename.swp
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343