Linux文件管理
目录结构
一切以根为顶点的目录
$ ll /
总用量 24
lrwxrwxrwx. 1 root root 7 9月 12 10:55 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 9月 12 11:02 boot
drwxr-xr-x. 20 root root 3240 9月 20 10:54 dev
drwxr-xr-x. 77 root root 8192 9月 20 12:15 etc
drwxr-xr-x. 3 root root 18 9月 12 11:01 home
lrwxrwxrwx. 1 root root 7 9月 12 10:55 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 9月 12 10:55 lib64 -> usr/lib64
drwxr-xr-x. 2 root root 6 4月 11 2018 media
drwxr-xr-x. 2 root root 6 4月 11 2018 mnt
drwxr-xr-x. 2 root root 6 4月 11 2018 opt
dr-xr-xr-x. 114 root root 0 9月 20 10:54 proc
dr-xr-x---. 5 root root 4096 9月 20 12:10 root
drwxr-xr-x. 26 root root 760 9月 20 12:45 run
lrwxrwxrwx. 1 root root 8 9月 12 10:55 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 4月 11 2018 srv
dr-xr-xr-x. 13 root root 0 9月 20 10:54 sys
drwxrwxrwt. 25 root root 4096 9月 20 13:02 tmp
drwxr-xr-x. 13 root root 155 9月 12 10:55 usr
drwxr-xr-x. 19 root root 267 9月 12 11:24 var
硬链接和软链接
和源文件索引节点一样的文件是硬链接, 反之则是软链接
用户所使用的命令的目录
目录 | 说明 |
---|---|
/bin | /bin目录的硬链接 |
/sbin | /sbin 目录的硬链接 |
/usr/bin | 普通用户所使用得命令的目录 |
/usr/sbin | 超级管理员所使用的命令目录 |
$ ls -lid /usr/bin/
50331721 dr-xr-xr-x. 2 root root 24576 9月 20 12:45 /usr/bin/
$ ls -lid /bin/
50331721 dr-xr-xr-x. 2 root root 24576 9月 20 12:45 /bin/
$ ls -lid /usr/sbin/
77 dr-xr-xr-x. 2 root root 12288 9月 20 12:45 /usr/sbin/
$ ls -lid /sbin/
77 dr-xr-xr-x. 2 root root 12288 9月 20 12:45 /sbin/
引导目录
目录 | 说明 |
---|---|
/boot | 引导目录, 存放grub菜单和内核的信息 |
设备目录
目录 | 说明 |
---|---|
/dev | 设备目录 |
/dev/cdrom | /dev/sr0 的软链接 |
/dev/sr0 | 光驱, 光盘 |
/dev/random | 产生随机数 |
/dev/zero | 源源不断产生数据的文件 |
/dev/pts/ | 虚拟终端 |
/dev/sd* | 磁盘分区 |
/dev/stderr | 错误输出 2 |
/dev/stdin | 标准输入 0 |
/dev/stdout | 标准输出 1 |
/dev/null | 黑洞 |
>>> 光驱, 光盘
$ ll -i /dev/cdrom
28731 lrwxrwxrwx. 1 root root 3 9月 20 10:54 /dev/cdrom -> sr0
$ ll -i /dev/sr0
17931 brw-rw----. 1 root cdrom 11, 0 9月 20 10:54 /dev/sr0
>>> 虚拟终端
$ ll /dev/pts/
总用量 0
crw--w----. 1 root tty 136, 0 9月 20 13:25 0
c---------. 1 root root 5, 2 9月 20 10:54 ptmx
>>> 输入输出目录
$ ll -i /dev/stderr
8729 lrwxrwxrwx. 1 root root 15 9月 20 10:54 /dev/stderr -> /proc/self/fd/2
$ ll -i /dev/stdin
8727 lrwxrwxrwx. 1 root root 15 9月 20 10:54 /dev/stdin -> /proc/self/fd/0
$ ll -i /dev/stdout
8728 lrwxrwxrwx. 1 root root 15 9月 20 10:54 /dev/stdout -> /proc/self/fd/1
配置文件目录
目录 | 说明 |
---|---|
/etc | 配置文件 |
/etc/sysconfig/network-scripts/ifcfg-e* | 网卡配置文件(这里配置的DNS优先级高) |
/etc/hostname | 主机名配置文件 |
/etc/resolv.conf | 本地的dns配置文件(这里配置的DNS优先级低) |
/etc/fstab | 挂载设备配置文件 |
/etc/sysconfig/selinux | 安全策略配置文件 |
/etc/motd | 登录系统前显示内容 |
/etc/hosts | 本地域名解析的文件 |
>>> 网卡配置文件
$ cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=ens33
UUID=a5ae4b2e-6cb7-45b9-90dd-0420ce5d4b02
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.142.23
PREFIX=24
GATEWAY=192.168.142.2
DNS1=223.5.5.5
>>> 主机名配置文件
$ cat /etc/hostname
git
>>> 本地的dns配置文件
$ grep -v '#' /etc/resolv.conf
nameserver 223.5.5.5
>>> 挂载设备配置文件
$ grep -v '#' /etc/fstab
/dev/mapper/centos-root / xfs defaults 0 0
UUID=67ddc4bb-c4e8-4715-b6b4-292df3699ce5 /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
>>> 安全策略配置文件
$ grep -v '#' /etc/sysconfig/selinux
SELINUX=enforcing
SELINUXTYPE=targeted
>>> 本地域名解析的文件
$ grep -v '#' /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
>>> 登录系统前显示内容(一般不推荐, 会占用内存)
$ cat /etc/motd
"###################欢迎登陆主机##############"
>>> 退出重新登录主机
Last login: Fri Sep 20 14:08:11 2019 from 192.168.142.11
"###################欢迎登陆主机##############"
$
用户家目录
目录 | 说明 |
---|---|
/home | 所有普通用户的家目录 |
/root | 超级管理员的家目录 |
系统管理的目录
目录 | 说明 |
---|---|
/proc | 虚拟的信息,存放系统实时状态信息 |
/run | 程序运行产生的pid文件存放点 |
/usr | 安装软件目录 |
/usr/local | 安装软件目录 |
/var | 可变的目录 |
/var/run | /run的硬链接 |
/var/log | 存放日志的目录 |
/var/log/messages | 系统日志 |
/var/log/secure | 用户登录日志 |
>>>> 程序运行产生的pid文件存放点
$ ll -id /run/
8713 drwxr-xr-x. 26 root root 760 9月 21 00:30 /run/
$ ll -id /var/run/
8713 drwxr-xr-x. 26 root root 760 9月 21 00:30 /var/run/
>>>> 系统日志
$ tail -f /var/log/messages
Sep 21 00:05:54 git chronyd[6155]: Forward time jump detected!
Sep 21 00:05:54 git nm-dispatcher: req:2 'connectivity-change': start running ordered scripts...
Sep 21 00:05:54 git nm-dispatcher: req:3 'up' [ens33]: start running ordered scripts...
Sep 21 00:05:54 git nm-dispatcher: req:4 'connectivity-change': start running ordered scripts...
Sep 21 00:08:46 git chronyd[6155]: Selected source 202.112.29.82
Sep 21 00:09:52 git systemd: Started Session 11 of user root.
Sep 21 00:09:52 git systemd-logind: New session 11 of user root.
Sep 21 00:20:18 git systemd: Got automount request for /proc/sys/fs/binfmt_misc, triggered by 9488 (ls)
Sep 21 00:20:18 git systemd: Mounting Arbitrary Executable File Formats File System...
Sep 21 00:20:18 git systemd: Mounted Arbitrary Executable File Formats File System.
>>>> 用户登录日志
$ tail -f /var/log/secure
Sep 20 14:07:59 git sshd[8981]: pam_unix(sshd:session): session closed for user root
Sep 20 14:08:11 git sshd[9008]: Accepted publickey for root from 192.168.142.11 port 57050 ssh2: DSA SHA256:mGJDCO9vLiNLJQZA6NRYY4lyHBUdrnAFihpxJSN9n3w
Sep 20 14:08:11 git sshd[9008]: pam_unix(sshd:session): session opened for user root by (uid=0)
Sep 20 14:08:38 git sshd[9008]: error: Received disconnect from 192.168.142.11 port 57050:0:
Sep 20 14:08:38 git sshd[9008]: Disconnected from 192.168.142.11 port 57050
Sep 20 14:08:38 git sshd[9008]: pam_unix(sshd:session): session closed for user root
Sep 20 14:08:53 git sshd[9036]: Accepted publickey for root from 192.168.142.11 port 57052 ssh2: DSA SHA256:mGJDCO9vLiNLJQZA6NRYY4lyHBUdrnAFihpxJSN9n3w
Sep 20 14:08:54 git sshd[9036]: pam_unix(sshd:session): session opened for user root by (uid=0)
Sep 21 00:09:52 git sshd[9412]: Accepted publickey for root from 192.168.142.11 port 61648 ssh2: DSA SHA256:mGJDCO9vLiNLJQZA6NRYY4lyHBUdrnAFihpxJSN9n3w
Sep 21 00:09:52 git sshd[9412]: pam_unix(sshd:session): session opened for user root by (uid=0)
不常用的目录
目录 | 说明 |
---|---|
/lib | /usr/lib的软链接 |
/lib64 | /usr/lib64的硬链接 |
usr/lib | 命令调用的库文件的目录 |
usr/lib64 | 命令调用的64位库文件的目录 |
/media | 挂载点,可移动的设备 |
/mnt | 临时挂载点 |
/opt | 早期第三方软件安装目录 |
/srv | 物理设备的信息 |
/sys | 物理设备的信息 |
/tmp | 文件的临时的存放点 |
>>>> 命令调用的库文件的目录
$ ll -id /usr/lib
16777313 dr-xr-xr-x. 28 root root 4096 9月 12 10:57 /usr/lib
$ ll -id /lib
80 lrwxrwxrwx. 1 root root 7 9月 12 10:55 /lib -> usr/lib
>>>> 命令调用的64位库文件的目录
$ ll -id /usr/lib64/
79 dr-xr-xr-x. 42 root root 24576 9月 14 01:01 /usr/lib64/
$ ll -id /lib64/
79 dr-xr-xr-x. 42 root root 24576 9月 14 01:01 /lib64/
$ du -shx /usr/lib64/
172M /usr/lib64/
$ du -shx /lib64/
172M /lib64/
文件和目录的操作命令
ls
显示目录列表
选项 | 说明 |
---|---|
-a | 显示所有文件, 包括隐藏文件 |
-l | 以长格式显示目录列表, 带属性信息 |
-1 | 显示列表 |
-d | 只显示目录本身信息 |
-i | 显示索引节点信息(inode号) |
-h | 以人类可读的形式显示文件大小 |
-F | 给显示出来的目录加个标识符(/) |
-S | 根据文件大小排序 |
-t | 根据时间进行排序 |
-r | 倒序排序 |
>>>> 给显示出来的目录加个标识符(/)
$ ll -F
总用量 36
-rw-r--r--. 1 root root 0 9月 16 09:36 ,$1}
-rw-r--r--. 1 root root 0 9月 16 09:36 ,$1,$NF}
-rw-------. 1 root root 1681 9月 12 11:02 anaconda-ks.cfg
-rwxr-xr-x. 1 root root 86 9月 16 19:12 array.sh*
-rw-r--r--. 1 root root 131 9月 14 01:24 col6.txt
drwxr-xr-x. 3 root root 18 9月 17 02:18 FishC/
drwxr-xr-x. 3 root root 45 9月 13 22:55 git_data/
-rw-r--r--. 1 root root 4056 9月 20 12:10 help.txt
-rw-r--r--. 1 root root 924 9月 14 01:02 netstat.txt
-rw-r--r--. 1 root root 0 9月 16 10:54 ,$NF}
-rw-r--r--. 1 root root 12 9月 19 12:46 oldboy.sh
-rw-r--r--. 1 root root 989 9月 16 09:45 passwd
-rw-r--r--. 1 root root 28 9月 16 19:29 test.sh
-rw-r--r--. 1 root root 202 9月 16 20:48 test.txt
>>>> 根据文件大小排序
$ ll -S
-rw-r--r--. 1 root root 4056 9月 20 12:10 help.txt
-rw-------. 1 root root 1681 9月 12 11:02 anaconda-ks.cfg
-rw-r--r--. 1 root root 989 9月 16 09:45 passwd
-rw-r--r--. 1 root root 924 9月 14 01:02 netstat.txt
-rw-r--r--. 1 root root 202 9月 16 20:48 test.txt
-rw-r--r--. 1 root root 131 9月 14 01:24 col6.txt
...
>>>> 根据时间进行排序
$ ll -t
-rw-r--r--. 1 root root 4056 9月 20 12:10 help.txt
-rw-r--r--. 1 root root 12 9月 19 12:46 oldboy.sh
drwxr-xr-x. 3 root root 18 9月 17 02:18 FishC
-rw-r--r--. 1 root root 202 9月 16 20:48 test.txt
-rw-r--r--. 1 root root 28 9月 16 19:29 test.sh
-rwxr-xr-x. 1 root root 86 9月 16 19:12 array.sh
...
>>>> 倒序排序
$ ll -rt
-rwxr-xr-x. 1 root root 86 9月 16 19:12 array.sh
-rw-r--r--. 1 root root 28 9月 16 19:29 test.sh
-rw-r--r--. 1 root root 202 9月 16 20:48 test.txt
drwxr-xr-x. 3 root root 18 9月 17 02:18 FishC
-rw-r--r--. 1 root root 12 9月 19 12:46 oldboy.sh
-rw-r--r--. 1 root root 4056 9月 20 12:10 help.txt
...
cd
切换目录
cd / 切换到根目录
cd . 保持当前目录
cd .. 切换到当前目录的上一级目录
cd ~ 切换到当前用户的家目录下
cd 默认切换到当前用户的家目录下
cd - 切换到上一次所在的目录
tree
以树状形显示目录结构
选项
选项 | 说明 |
---|---|
-a | 显示隐藏文件 |
-d | 只显示目录 |
-f | 只显示文件 |
-F | 给目录加个标识符 |
-L | 查看目录的深度,层级,后面跟的是正整数 |
>>> 查看目录的深度,层级,后面跟的是正整数
>>> 给目录加个标识符
$ tree -LF 2
.
├── ,$1}
├── ,$1,$NF}
├── anaconda-ks.cfg
├── array.sh*
├── col6.txt
├── FishC/
│ └── sle2/
├── git_data/
│ ├── a
│ ├── b
│ └── c
├── help.txt
├── netstat.txt
├── ,$NF}
├── oldboy.sh
├── passwd
├── test.sh
└── test.txt
3 directories, 15 files
>>>> 只显示目录
$ tree -d
.
├── FishC
│ └── sle2
└── git_data
3 directories
mkdir
创建目录
选项 | 说明 |
---|---|
-p | 创建多层目录 |
-v | 显示创建过程 |
-m | 创建给目录设置其他权限 |
{} | 生成序列, 创建多个目录 |
>>>> 创建给目录设置其他权限
$ mkdir -m 700 data2
$ mkdir data3
$ ll -d data3
drwxr-xr-x. 2 root root 6 9月 21 01:32 data3
$ ll -d data2
drwx------. 2 root root 6 9月 21 01:32 data2
>>>> 创建多个文件
$ mkdir oldboy oldgirl newboy newgirl
$ mkdir oldboy{1..10}
$ mkdir oldboy{frank,tank,json}
touch
创建文件
1.在一个路径下,不能出现同名的文件,会改变原文件的时间戳
2.使用{},创建多个文件,区分大小写。
cp
复制,拷贝
选项 | 说明 |
---|---|
-r | 递归复制 |
-p | 保持属性 |
-d | 保持软连接 |
-t | 把原目标和目标位置进行替换 |
-a | =-pdr |
-i | 交互式询问,系统自带别名 |
$ ll /
总用量 24
lrwxrwxrwx. 1 root root 7 9月 12 10:55 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 9月 12 11:02 boot
drwxr-xr-x. 20 root root 3240 9月 20 10:54 dev
drwxr-xr-x. 77 root root 8192 9月 21 00:05 etc
drwxr-xr-x. 3 root root 18 9月 12 11:01 home
lrwxrwxrwx. 1 root root 7 9月 12 10:55 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 9月 12 10:55 lib64 -> usr/lib64
drwxr-xr-x. 2 root root 6 4月 11 2018 media
drwxr-xr-x. 2 root root 6 4月 11 2018 mnt
drwxr-xr-x. 2 root root 6 4月 11 2018 opt
dr-xr-xr-x. 115 root root 0 9月 20 10:54 proc
dr-xr-x---. 25 root root 4096 9月 21 01:35 root
drwxr-xr-x. 26 root root 760 9月 21 00:30 run
lrwxrwxrwx. 1 root root 8 9月 12 10:55 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 4月 11 2018 srv
dr-xr-xr-x. 13 root root 0 9月 20 10:54 sys
drwxrwxrwt. 25 root root 4096 9月 21 01:35 tmp
drwxr-xr-x. 13 root root 155 9月 12 10:55 usr
drwxr-xr-x. 19 root root 267 9月 12 11:24 var
$ cp -a /lib /opt/
$ ll /opt/
总用量 0
lrwxrwxrwx. 1 root root 7 9月 12 10:55 lib -> usr/lib
mv
移动
选项 | 说明 |
---|---|
-f | 强制覆盖 |
-t | 把原目标和目标位置进行替换 |
-i | 交互式询问,系统自带别名 |
$ ll -d netstat.txt
-rw-r--r--. 1 root root 26 9月 21 01:59 netstat.txt
$ ll /mnt/netstat.txt
-rw-r--r--. 1 root root 924 9月 14 01:02 /mnt/netstat.txt
$ mv -f netstat.txt /mnt/
$ ll /mnt/netstat.txt
-rw-r--r--. 1 root root 26 9月 21 01:59 /mnt/netstat.txt
$ ll
-rw-r--r--. 1 root root 989 9月 16 09:45 passwd
$ ll /opt/
lrwxrwxrwx. 1 root root 7 9月 12 10:55 lib -> usr/lib
drwxr-xr-x. 2 root root 6 9月 21 01:51 oldboy
$ mv -t ./ /opt/oldboy/
$ ll
drwxr-xr-x. 2 root root 6 9月 21 01:51 oldboy
-rw-r--r--. 1 root root 989 9月 16 09:45 passwd
rm
删除
选项 | 说明 |
---|---|
-f | 强制删除 |
-r | 递归删除 |
-i | 交互式询问,系统自带别名 |
查看文件命令
echo
所见即所得
选项 | 意义 |
---|---|
-e | 支持特殊符号的含义 |
符号名字 | 含义 |
---|---|
单引号 | 强引用,所见即所得 |
双引号 | 所见即所得,支持变量,会解析变量 |
不加引号 | 所见即所得,出现空格不会看做是个整体,会解析变量,支持通配符 |
反引号 | 先执行反引号里面的命令,把结果交给外面的命令。和$()作用一样 |
-e
支持换行符, tab键
$ echo -e 'hello\nworld'
hello
world
$ echo -e 'hello\tworld'
hello world
echo表示颜色
$ echo -e "\033[30m黑色字\033[0m"
$ echo -e "\033[31m红色字\033[0m"
$ echo -e "\033[32m绿色字\033[0m"
$ echo -e "\033[33m黄色字\033[0m"
$ echo -e "\033[34m蓝色字\033[0m"
$ echo -e "\033[35m紫色字\033[0m"
$ echo -e "\033[36m天蓝字\033[0m"
$ echo -e "\033[37m白色字\033[0m"
echo表示背景
echo -e "\033[40m黑底白字\033[0m"
echo -e "\033[41m红底白字\033[0m"
echo -e "\033[42m绿底白字\033[0m"
echo -e "\033[43m黄底白字\033[0m"
echo -e "\033[44m蓝底白字\033[0m"
echo -e "\033[45m紫底白字\033[0m"
echo -e "\033[46m天蓝底白字\033[0m"
echo -e "\033[47m白底白字\033[0m"
cat
查看文件内容
选项 | 含义 |
---|---|
-n | 给显示内容加上行号 |
-A | 给每行的结尾加上标识符 |
- 使用cat创建新文件
>>> cat创建新文件
$ cat >> oldboy.txt <<E
> egon
> lxx
> alex
> E
$ cat oldboy.txt
egon
lxx
alex
$ cat -A oldboy.txt
egon$
lxx$
alex$
>>> cat追加数据到文件
$ cat >>oldboy.txt <<E
> hhp
> lll
> E
$ cat oldboy.txt
egon
lxx
alex
hhp
lll
cat 创建文件遇到的小坑
当文件里面出现'$'符号, 结束符在定义的时候需要加上引号(单引号双引号都可以)
- 结束符
EOF
不加引号的情况
$ cat > test2.sh << EOF
> #!/bin/bash
> read -p '请输入用户名' name
> read -p '请输入密码' pwd
> echo "用户名 $name, 密码 $pwd"
> EOF
$ cat test2.sh
#!/bin/bash
read -p '请输入用户名' name
read -p '请输入密码' pwd
echo "用户名 , 密码 "
$ chmod +x test2.sh
$ ./test2.sh
请输入用户名lxx
请输入密码sb
用户名 , 密码
- 结束符
EOF
加上引号可以正常输出
$ cat > test.sh << 'EOF'
> #!/bin/bash
> read -p '请输入用户名' name
> read -p '请输入密码' pwd
> echo "用户名 $name, 密码 $pwd"
> EOF
$ chmod +x test.sh
$ ./test.sh
请输入用户名lxx
请输入密码123
用户名 lxx, 密码 123
more
分页显示文件内容,文件结束时,会自动退出文件
外部选项 | 说明 |
---|---|
-n(数字) | 指定一页显示多少行 |
+n(数字) | 指定从第几行开始显示 |
$ more +15 /etc/passwd
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/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
java:x:1000:1000:java:/home/java:/bin/bash
$ more -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
--More--(18%)
内部命令 | 说明 |
---|---|
空格或f | 向下翻页 |
b | 向上翻页 |
回车 | 下一行 |
/ | 搜索 |
= | 显示当前光标所在行 |
q | 退出 |
less
分页显示文件内容,文件结束时,不会自动退出
外部选项 | 说明 |
---|---|
-N | 显示的时候加上行号 |
$ less -N /etc/services
内部命令 | 说明 |
---|---|
空格或f | 向下翻页 |
b | 向上翻页 |
回车 | 下一行 |
/ | 搜索, 会高亮 |
= | 显示当前光标所在页, 第几行到第几行, 会显示字节大小 |
q | 退出 |
head
显示文件头部信息,默认显示前十行内容
选项 | 说明 |
---|---|
-n (数字) | 取消默认输出,指定显示几行 |
-c | 显示头部几个字符 |
$ head -n5 /etc/services
# /etc/services:
# $Id: services,v 1.55 2013/04/14 ovasik Exp $
#
# Network services, Internet style
# IANA services version: last updated 2013-04-10
$ head -5 /etc/services
# /etc/services:
# $Id: services,v 1.55 2013/04/14 ovasik Exp $
#
# Network services, Internet style
# IANA services version: last updated 2013-04-10
$ head -c 5 /etc/services
# /et
tail
显示文件尾部信息,默认显示十行内容
选项 | 说明 |
---|---|
-n | 取消默认输出,指定显示几行 简写 -数字 |
-c | 显示尾部几个字符,最后一个是换行符 |
-f | 实时查看文件的更新 |
-F | 实时查看文件的更新,文件不存在时,不会退出,会一直尝试读取该文件 |
tailf
实时查看文件的更新,在磁盘不更新时,不会读取磁盘,减少磁盘的读写
$ tail -F /var/log/mess
tail: 无法打开"/var/log/mess" 读取数据: 没有那个文件或目录
$ tail -f /var/log/messages
$ tailf /var/log/messages
tailf
和 tail -f
区别
在显示结果上没有任何区别, 在底层有区别
tail -f
会不停地读取磁盘中文件的内容, 不管文件有没有更新
tailf
则是只有文件更新的时候才会读取磁盘中文件的内容
tailf
会减少磁盘的读写, 减少性能的使用
文件查找
locate
根据本地数据库进行查找, 查找前需要更新数据库
$ yum provides locate
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* base: ftp.sjtu.edu.cn
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
mlocate-0.26-8.el7.x86_64 : An utility for finding files by name
源 :base
匹配来源:
文件名 :/usr/bin/locate
$ yum -y install mlocate-0.26-8.el7.x86_64
$ locate hostname
locate: 无法执行 stat () `/var/lib/mlocate/mlocate.db': 没有那个文件或目录
$ updatedb
$ locate hostname
/etc/hostname
/etc/dbus-1/system.d/org.freedesktop.hostname1.conf
/etc/selinux/targeted/active/modules/100/hostname
/etc/selinux/targeted/active/modules/100/hostname/cil
/etc/selinux/targeted/active/modules/100/hostname/hll
/etc/selinux/targeted/active/modules/100/hostname/lang_ext
/usr/bin/hostname
>>> 支持正则(需要加上-r选项)
$ locate -r hostname$
/etc/hostname
/etc/selinux/targeted/active/modules/100/hostname
/usr/bin/hostname
/usr/bin/nmtui-hostname
/usr/lib64/gettext/hostname
which
查找命令的绝对路径
$ which hostname
/usr/bin/hostname
whereis
$ whereis hostname
hostname: /usr/bin/hostname /etc/hostname /usr/share/man/man1/hostname.1.gz /usr/share/man/man5/hostname.5.gz
type
查看命令类型
- -a 查看内置命令的绝对路径
$ type hostname
hostname 是 /usr/bin/hostname
$ type cd
cd 是 shell 内嵌
$ type -a cd
cd 是 shell 内嵌
cd 是 /usr/bin/cd
find
>>>> 默认精确查找
$ find / -type f -name "*hostname"
>>>> 加上通配符模糊查询
find / -type f -name "*hostname*" >>> 类似于locate hostname
文件上传下载
curl
通过url的方式进行文件传输
-
查看是否能访问网站
输出的结果是网站的HTML代码
$ curl www.baidu.com
- -o 下载文件
$ curl -o nginx.tar.gz http://nginx.org/download/nginx-0.1.14.tar.gz
$ ll nginx.tar.gz
-rw-r--r--. 1 root root 263949 9月 21 21:36 nginx.tar.gz
wget
下载文件
$ wget -O nginx.tar.gz http://nginx.org/download/nginx-0.1.14.tar.gz
scp
- 上传文件
$ scp nginx.tar.gz root@192.168.142.40:/root/
- 下载文件
$ scp root@192.168.142.40:/root/nginx.tar.gz .
rz
本地上传和下载
$ yum install -y lrzsz
- 上传
$ rz
- 下载
$ sz *
xftp
大文件上传和下载
安装注册码 101210-450789-147200
字符处理
sort
排序
2
选项 | 说明 |
---|---|
-t | 指定分隔符, 默认以空白字符为分隔符 |
-k | 指定列数 |
-n | 以数字的大小方式进行排序 |
-r | 倒序 |
$ cat > file.txt <<EOF
> b:3
> c:4
> d:5
> e:11
> f:33
> a:22
> EOF
$ sort file.txt
a:22
b:3
c:4
d:5
e:11
f:33
$ sort -t ':' file.txt
a:22
b:3
c:4
d:5
e:11
f:33
$ sort -t ':' -k2 file.txt
e:11
a:22
b:3
f:33
c:4
d:5
$ sort -t ':' -nk2 file.txt
b:3
c:4
d:5
e:11
a:22
f:33
$ sort -t ':' -rnk2 file.txt
f:33
a:22
e:11
d:5
c:4
b:3
$ sort -t ':' /etc/passwd -nk3
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
...
uniq
对相邻的行进行去重统计
- -c 统计次数
$ cat >>test.txt <<EOF
> tank
> egon
> tank
> egon
> oldboy
> frank
> EOF
$ sort test.txt |uniq
egon
frank
oldboy
tank
统计每一行中的内容出现的次数
$ sort test.txt |uniq -c |sort -nr
2 tank
2 egon
1 oldboy
1 frank
cut
擅长取列, 默认是以tab键为分隔符
选项 | 说明 |
---|---|
-d | 指定分隔符 |
-f | 指定取出的列 |
-c | 取指定的字符 |
$ echo 'oldboyfgkdfssdsd' |cut -c 1-6
oldboy
$ echo 'frank, QQ is 1176494252' > file2.txt
$ cut -d ' ' -f2,4 file2.txt
QQ 1176494252
$ echo 'frank ,QQ is 1176494252'>file2.txt
>>> 第一种方法
$ cut -d ' ' -f2,4 file2.txt |cut -d ',' -f2
QQ 1176494252
>>> 第二种方法
$ cut -d ' ' -f2,4 file2.txt |tr -d ','
QQ 1176494252
统计/etc/passwd
中所有解释器用到的次数
>>> 第一种方法
$ cut -d: -f7 /etc/passwd|sort|uniq -c|sort -n
1 /bin/sync
1 /sbin/halt
1 /sbin/shutdown
2 /bin/bash
16 /sbin/nologin
>>> 第二种方法
$ awk -F: '{print $7}' /etc/passwd|sort|uniq -c|sort -n
1 /bin/sync
1 /sbin/halt
1 /sbin/shutdown
2 /bin/bash
16 /sbin/nologin
>>> 第三种方法
$ awk -F: '{a[$7]++}END{for(i in a){print a[i]":"i}}' /etc/passwd|sort -t: -n
1:/bin/sync
1:/sbin/halt
1:/sbin/shutdown
2:/bin/bash
16:/sbin/nologin
wc
统计
选项 | 说明 |
---|---|
-l | 统计文件的行数 |
-c | 统计文件的字节数, 包括换行符 |
-w | 以空格为分隔符, 统计文件的单词数 |
$ cat > test5.txt <<EOF
> root:apple
> /bin/bash:bin
> apple
> root:apple
> EOF
$ wc -l test5.txt
4 test5.txt
$ wc -w test5.txt
4 test5.txt
$ wc -c test5.txt
42 test5.txt
tr
不能单独对文件操作, 必须先将文件输入给tr
命令
tr
全局替换
$ echo 'frank QQ, is 1176494252'>file2.txt
$ cut -d ' ' -f2,4 file2.txt|tr '1' '0'
QQ, 0076494252
$ echo "HELLO WHO IS SB"|tr 'A-Z' 'a-z'
hello who is sb
说明: 这里的A被替换为a, B被替换为b, ...Z被替换为z
$ echo 12345 |tr '0-9' '9876543210'
87654
说明: 0被替换为9, 1被替换为8, 2被替换为7, ...9替换为0
- -d 删除字符
$ echo 'frank QQ, is 1176494252'>file2.txt
>>> 通过cut无法筛选出QQ 117649425
$ cut -d ' ' -f2,4 file2.txt|cut -d ',' -f1,2
QQ, 117649425
>>>> 通过tr -d 删除字符串中的逗号
$ cut -d ' ' -f2,4 file2.txt|tr -d ','
QQ 1176494252
- -c 替换或者删除差集
$ echo hello 1 char 2 next 4 |tr -d -c '0-9 \n'
1 2 4
$ echo hello 1 char 2 next 4 |tr -c '0-9\n' ' '
1 2 4
- -s 删除多余的换行符
$ cat >multi_blank.txt<<EOF
> line1
>
> line2
>
>
> line3
> line4
> EOF
$ cat multi_blank.txt
line1
line2
line3
line4
$ tr -s '\n'<multi_blank.txt
line1
line2
line3
line4
- 计算文件中数字的所有结果
$ cat sum.txt
1
2
3
4
5
>>>> 先把算法列出来
$ echo $(tr '\n' '+'<sum.txt)
1+2+3+4+5++
>>>> 根据上面的算法, 需要多加个0, 不然会报错
$ echo $(tr '\n' '+'<sum.txt)0
1+2+3+4+5++0
>>>> 然后把结果计算出来, bash中$[加减乘除运算] 可以得到运算的结果
$ echo $[$(tr '\n' '+'<sum.txt)0]
15
- 计算包含字母和数字的文件中所有数字的和
$ cat test.txt
first 1
second 2
third 3
>>> 第一种方法
----->>>首先把所有数字搞出来
$ tr -d -c '0-9\n' < test.txt
1
2
3
----->>>将算法搞出来
$ echo $(tr -d -c '0-9\n' < test.txt |tr '\n' '+')0
1+2+3+0
----->>>算出结果
$ echo $[$(tr -d -c '0-9\n' < test.txt |tr '\n' '+')0]
6
>>>> 第二种方法
----->>>首先把所有数字搞出来
$ tr -d [a-z]<test.txt
1
2
3
----->>>将算法搞出来
$ tr -d [a-z]<test.txt |echo $(tr ' ' '+')
+1 +2 +3
----->>>算出结果
$ tr -d [a-z]<test.txt |echo $[echo $(tr ' ' '+')]
6