bash shell特性
- 什么是bash shell
bash shell 是命令解释器,存在于linux操作系统的最外层,负责将用户输入的命令翻译给操作系统内核进行执行的接口。 - bash shell的执行流程
1)判断命令是否通过绝对路径进行执行
2)判断命令是否有alias别名
3)判断命令是内部命令还是外部命令
4)如果是内部命令直接执行,外部命令查找是否有hash缓存
5)如果没有hash缓存,通过PATH路径进行查找 - 什么是内部命令,什么是外部命令
1)内部命令:shell程序自带的命令
2)外部命令:在系统PATH变量中某个路径下的可执行程序 - 如何检查输入的命令是外部命令还是内部命令
使用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
- 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
- 如果是外部命令,执行完命令将缓存在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
- 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
- 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 /
文件管理
- 系统的目录结构
[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: 主要存放的是一些日志文件
- 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 /]$
- 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
- 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’
- 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
- 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’
- 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
- 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 #强制删除目录,不提醒(慎用)
- 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$
- more/less命令
以翻页的形式显示文件内容 - 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
- 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
- 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
- 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
- 修改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地址 - rz/sz 命令
rz : 上传文件到linux中
sz: 从linux中下载文件
使用rz/sz命令需要安装lrzsz软件,使用yum install -y lrzsz命令下载软件
rz #上传文件到linux当前目录中
sz /path/file #下载/path/file文件到Windows中
- 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
- 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
- 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
- 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
- wc命令
统计行号 选项: -l 统计文件行数
[root@localhost.localdomain ~]$ wc -l ip.txt
24 ip.txt
- 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
- 取出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
- 取出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
- 修改/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
- 系统文件类型
- 普通文件(文本, 二进制, 压缩, 图片, 日志等)
d 目录文件
b 设备文件(块设备)存储设备硬盘 /dev/sda1, /dev/sda2
c 设备文件(字符设备),终端 /dev/tty1, /dev/zero
s 套接字文件, 进程间通信(socket)
p 管道文件
l 链接文件
- 查看普通文件的详细类型(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
- 系统链接文件
文件有文件名与数据,在Linux上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方,我们将其称为Block元数据,即文件的附加属性,如文件大小、创建时间、所有者等信息。我们称其为Inode在Linux中,inode是文件元数据的一部分但其并不包含文件名,inode号即索引节点号)文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。 - 什么是软链接
软链接相当于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
- 什么是硬链接
若一个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
- 为什么创建的空目录有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)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键)
-------------------------------------------
- vim环境变量设置
~/.vimrc 个人环境变量 /etc/vimrc 全局环境变量
# vim ~/.vimrc #当下次再打开文件自动显示行号并忽略大小写
set nu
set ic
#如果个人vim环境没有配置, 则使用全局vim环境变量配置。
#如果个人vim环境和全局环境变量产生冲突, 优先使用个人vim环境变量。
- 相同文件之间差异对比,通常用于对比修改前后差异
vimdiff #以vim方式打开两个文件对比,高亮显示不同的内容
- 如果VIM非正常退出 (ctrl+z)挂起或强制退出终端没关闭VIM后
# 假设打开filename文件被以外关闭,需要删除同文件名的.swp文件即可解决
# rm -f .filename.swp