[TOC]
# Linux系统命令介绍
Linux默认安装后有上千个系统命令之多,包含了常用命令和管理员命令,但最常用的不超过20个命令,以下整理了最常用的系统命令和案例。除以下20个命令外我们还可以通过“man”命令,即帮助手册来查询其它的命令使用方法和案例。
## ls 查看命令
ls(list directory contents) 显示文件及文件目录 ls--(list) , ls命令的常用参数:
* -a 常用参数和意义
* -l 显示目录下所有文件包括隐藏文件
```
[djangowang@localhost ~]# ls -al
total 188
drwxr-x--- 14 root root 4096 Oct 25 21:53 .
drwxr-xr-x 25 root root 4096 Nov 10 21:04 ..
-rw------- 1 root root 1069 Oct 25 21:41 anaconda-ks.cfg
-rw------- 1 root root 31 Oct 25 21:46 .bash_history
-rw-r--r-- 1 root root 24 Jan 6 2007 .bash_logout
```
每一列的含义
| 列 | 含义 | 案例 |
| --- | --- |--- |
| 第一列 | 文件权限和属性 | drwxr-x--- |
| 第二列 | 硬链接(hard link)。对于新建的目录,其硬链接计数为2,分别是.和.. | 数值 |
| 第三列 | 文件所属用户 | root |
| 第四列 | 文件所属组 | root |
| 第五列 | 文件大小(单位字节) | 4096(4k) |
| 第六列 | 文件最后修改时间 | Oct 25 21:41 |
| 第七列 | 文件名 | anaconda-ks.cfg |
*注:文件是存储在硬盘上的,硬盘的最小存储单位叫做扇区,每个扇区存储512字节。操作系统读取硬盘的时候,不会一个个扇区地读取,而是一次性连续读取多个扇区,即一次性读取一个“块”。这种由多个扇区组成的块,是文件存取的最小单位。块的大小,最常见的是4KB,即连续八个扇区组成一个“块”。文件数据存储在块中,那么还必须找到一个地方存储文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等,这种存储文件元信息的区域就叫做inode。每个inode节点中都有一个链接计数器,只有链接计数为零时才会删除,这就是为什么,”解除一对文件链接“并不意味着释放改文件块的原因。*
## cd 命令
用户目录的切换。 cd命令的常用参数:
* (-)回到刚刚去的目录
* 返回宿主目录
* 去上一级目录
```
[djangowang@localhost ~]# cd /etc # 进入/etc目录
[djangowang@localhost ~]# cd ~ # 返回宿主目录
```
## mkdir命令
mkdir(make directories)创建目录结构。mkdir命令的常用参数:
* -p 递归创建目录
```
[djangowang@localhost ~]# mkdir test
[djangowang@localhost ~]# ls
test
[djangowang@localhost ~]# mkdir -p .a/b/c/d
[djangowang@localhost ~]# tree
.
`-- a
`-- b
`-- c
`-- d
```
*注:tree命令是一个独立的系统命令,我们可以通过“yum install tree”来安装它。*
## pwd 命令
pwd(print name of current/working directory)查看路径。
```
[djangowang@localhost ~]# pwd
/root
```
## mv 命令
mv( move or rename files) 移动 & 改名命令 。 mv命令的常用参数:
* -i 覆盖前先询问用户
* \-b :若需覆盖文件,则覆盖前先行备份。
```
[djangowang@localhost ~]# mv test test1
[djangowang@localhost ~]# ls
test1
```
移动目录,(mv filename target )。
```
[djangowang@localhost ~]# mv test1 /etc
```
## find 命令
find(find - search for files in a directory hierarchy)查找命令,find命令的常用参数:
* find -name # 查找文件名
* find -type # 查找文件类型 (f 文件、d 目录、c 字符设备、l链接、s socket)
* find -exec # 执行系统命令
* find -mtime # 创建文件的时间
```
[djangwang@localhost ~]# find . -name "*.conf" # 查找当前目录下,以conf结尾文件
./pam_smb.conf
./java/java.conf
./nsswitch.conf
./gconf/2/evoldap.conf
./alsa/alsa.conf
./alsa/pcm/side.conf
./alsa/pcm/front.conf
...
```
查找20天前的日志并删除。
```
[djangwang@localhost ~]# find /var/log -type f -mtime +20 | xargs rm -f
```
将/etc目录下的*.conf文件,备份到/tmp目录下一份。
```
[djangwang@localhost ~]# find /etc/ -type f -name "*.conf" -exec cp {} /tmp/ \;
```
如果要放在Crontab中定时运行,推荐更严禁的书写方式。
```
[djangwang@localhost ~]# [ -d /var/logs ] && find /var/log -type f -mtime +20 | xargs rm -f
```
其中“[ -d /var/logs ] ” 判断目录是否存在,如果存在再执行find命令,防止目录不存在find命令从根目录开始删除。
## cp 命令
cp(copy files and directories) 复制命令,cp命令的常用参数:
* -R # 复制目录
```
[djangowang@localhost ~]# cp -R ./test ./test1
[djangowang@localhost ~]# ls
test1 test
```
## cat 命令
cat(concatenate files and print on the standard output)显示文件内容命令,cat命令的常用参数:
* -A # 显示特殊字符
* -n # 显示行号
```
[djangowang@localhost ~]# cat -n /etc/passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
...
```
## wc 命令
wc(print newline, word, and byte counts for each file) 统计命令,wc命令的常用参数:
* -l # 显示多少行
* -w # 显示多少单词
* -c # 显示字数
```
[djangowang@localhost ~]# wc -l /etc/passswd
[djangowang@localhost ~]# 35
```
## sort命令
sort(sort lines of text files)排序命令,sort命令的常用参数:
* -n # 数学形式排序(默认按首字母的ASCII排序)
* -r # 倒序排列
```
[djangowang@localhost ~]# for i in `seq 1 10`;do echo $i >> sort.txt ;done # 写入测试数据
[djangowang@localhost ~]# sort -r sort.txt
```
sort命令通常与uniq命令连用。 以下是统计Nginx日志每日访问的独立IP的次数。
* \-c或--count # 在每列旁边显示该行重复出现的次数
```
[djangowang@localhost ~]# cat access.log | awk '{print $1}' | sort -n | uniq -c
206 49.234.146.32
238 63.143.42.246
575 193.112.218.224
....
```
## grep 命令
grep (print lines matching a pattern)在文中查找命令,grep命令的常用参数:
* -l "查找内容" # 显示要查找内容的文件名
* -n "查找内容" # 显示行号
* -数字 "查找内容" # 显示查找内容的上下行内容
```
[djangowang@localhost ~]# grep "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
...
```
## 正则表达式
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。使用grep命令会经常用到正则匹配,譬如匹配ifconfig命令输出IP地址。关于grep命令的正则匹配常用参数:
* -E # 它会以扩展的正则表达式的模式来解释模式
* -o # 只显示正则显示的内容
```
[djangowang@localhost ~]# ifconfig | grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
172.17.0.1
255.255.0.0
0.0.0.0
172.16.16.2
255.255.240.0
172.16.31.255
127.0.0.1
255.0.0.0
```
正则表达式。
| 限定符 | 描述 |
| --- | --- |
| . | 匹配任意的一个字符。 |
| ? | 匹配前面的子表达式,最多一次。 |
| \* | 匹配前面的子表达式零次或多次。 |
| + | 匹配前面的子表达式一次或多次。 |
| {N} | 匹配前面的子表达式 N 次。 |
| {N,} | 匹配前面的子表达式 N 次到多次。 |
| {N,M} | 匹配前面的子表达式 N 到 M 次,至少 N 次至多 M 次。 |
| \- | 只要不是在序列开始、结尾或者序列的结束点上,表示序列范围。 |
| ^ | 匹配一行开始的空字符串;也表示字符不在要匹配的列表中。 |
| $ | 匹配一行末尾的空字符串。 |
| \\b | 匹配一个单词前后的空字符串。 |
| \\B | 匹配一个单词中间的空字符串。 |
| \\< | 匹配单词前面的空字符串。 |
| \\> | 匹配单词后面的空字符串。 |
## cut 命令
cut (remove sections from each line of files)切割命令,cut命令的常用参数:
* -d "分隔符" # 查找文件内容
* -f "列名" # 常与-d参数连用,用些分列显示列名
* -c "数字" # 显示截取后的内容
```
[djangowang@localhost ~]# cut -d : -f1 /etc/passwd
root
bin
daemon
...
```
## du命令
du ( estimate file space usage) 查看系统文件或目录大小。du命令的常用参数:
* -s # \--summarize ,显示汇总统计信息
* -h # 以 K,M,G 为单位,提高信息的可读性
```
[djangowang@localhost ~]# du -sh *
12K bakup
5.5M exa
1.9M get-pip.py
```
## rm命令
rm (remove files or directories) 删除文件或目录。它还有一个相同的命令就是rmdir(remove empty directories)用于删除空目录,但我们一般用rm命令可以完全替代它。命令的常用参数:
* -r # 递归删除,可以删除文件夹下所有文件
* -f # 强制删除
* -i # 删除前确认
```
[djangowang@localhost ~]# rm -rf /data1/tmp/*
```
*注:rm属于高危操作,需要谨慎。与Windows不同Linux下并没有回收站,所以删除任何文件前最好先将它移动到一个空目录,类似Windows回收,待过一段时间再统一清理这个目录的内容。关于Linux为什么没有回收站——这句话摘录自“Unix编程艺术”,Unix面向更加专业的用户 ,Unix的开发者喜欢清晰、简单的操作,用户告诉做什么就做什么,即便用户使用的命令等价于“向我开枪”的命令。而这样做Unix的开发本能辩解的就是:保护用户避免自我损害,应该是GUI或应用程序级别的事,而非操作系统*
## touch 命令
touch (touch - change file timestamps) 用于创建文本文件或修改文件的时间。
```
[djangowang@localhost ~]# touch test
[djangowang@localhost ~]# ls
test
```
## 查看文件内容命令
more (more - file perusal filter for crt viewing) 适用于查看文件内容比较多的场景。
```
[djangowang@qlocalhost ~]# more /etc/passwd
```
less (less - opposite of more)用于查看文件不多,需要浏览的场景。
```
[djangowang@qlocalhost ~]# less /etc/passwd
```
tail (tail - output the last part of files)用于查看文件内容行位,且文件会不断的追加的场景。
* -f # 动态查看文件追加的内容
* -n # 可以查看文件末尾多少行
```
[djangowang@qlocalhost ~]# tail -f /var/log/messages
[djangowang@qlocalhost ~]# tail -n 20 /var/log/messages
```
head(head - output the first part of files) 查看文件头部的内容。
* -n # 可以查看文件头部的多少行
```
[djangowang@qlocalhost ~]# head -n 20 /var/log/messages
```
## man
man ( an interface to the on-line reference manuals) 帮助手册
```
[djangowang@localhost ~]# man ls
```
# 命令自动补全
Linux系统命令比较多,部分命令比较长且难记,这里我们只要对他有一个模糊记忆,譬如只记录他以什么字母开头,并通过Linux系统快捷键(tab)自动补全功能,来逐步筛选你模糊记忆中的命令。
# 本章小结
本章从Linux常用的基础命令开始讲起,根据笔者的工作经历整理了最常用的命令和参数,并根据从简单到负责的顺序来介绍它。Linux命令有1000多个,每个命令有平均有5个左右参数,所以要记忆的知识点大概有5000多,我们不可能完全记忆它们,这时就需要帮助手册协助我们来查询这些命令的使用方法。Linux命令部分命令比较长不太容易记忆,Linux还提供了命令自动补全的快捷键来协助我们更好的掌握它们。下一章我们将会介绍常用的编辑器vim,为后续修改系统配置文件时作为铺垫。
# 习题
1.查找 /etc/passwd 文件中包含root的行,并显示第一行内容。
2.在根目录下创建 /data1/webroot/nginx 的目录结构。
3.如果通过grep命令查找出的关键字,并高亮显示关键字。
4. 查看文件的命令都有哪些,它们有什么区别?