[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. 查看文件的命令都有哪些,它们有什么区别?