摘要
Linux
命令是基于文本格式输入输出的一种程序,按照Unix哲学中强调的程序功能简单,输入宽松,输出严谨,各种程序组合可以具有更强大的功能,而具有这种灵活性的主要原因是Linux规定程序的输入输出必须坚持文件流格式,即文本格式,而这就是Linux系统的核心之一。
对于Bash,即Shell的一种,为现在主流Linux发行版本默认的命令行解释器,是一种功能强大的工具,可以实现对Linux支持的程序命令的组合,从而实现强大功能。类似于Window系统的bat文件,Bash具有更为强大的功能,通过Bash可以实现自动化的程序设计,功能执行甚至系统启动,而这些都要归功于Unix的设计理念。
本篇博文是基于笔者的经验之谈,仅供学习参考之用,存在疏漏还请留言指正,不胜感激~
-----------------------------------
Linux命令详解
-----------------------------------
目录相关命令
显示当前目录下的文件详情
ls
仅显示文件名,ll
即
‘ls -alF’命令的别称,通过 alias| grep’ll’命令可以查看:
[email protected]:~/test$ ls t1 test1 [email protected]:~/test$ ll total 12 drwxr-xr-x 3 king king 4096 2014-08-23 18:26 ./ drwxr-xr-x 39 king king 4096 2014-08-23 18:26 ../ -rw-r--r-- 1 king king 0 2014-08-23 18:26 t1 drwxr-xr-x 2 king king 4096 2014-08-23 18:26 test1/ [email protected]:~/test$ alias | grep 'll' alias ll='ls -alF'
另外,如果想通过经典的树形目录显示,可使用额外的tree命令(非内部命令),具体操作如下,
-L 2指的是以当前目录为根目录,显示目录结构到第二层:
[email protected]:~$ tree The program 'tree' is currently not installed. You can install it by typing: sudo apt-get install tree [email protected]:~$ sudo apt-get install [email protected]:~/test$ tree -L 2 . |-- t1 `-- test1 `-- t2 1 directory, 2 files
创建删除目录操作,使用mkdir和rmdir两个命令,对于删除,如果目录非空,可使用rm
–rf DirName
来实现:
[email protected]:~/test$ ls t1 test1 [email protected]:~/test$ mkdir test2 [email protected]:~/test$ rmdir test1 rmdir: failed to remove `test1': Directory not empty [email protected]:~/test$ rm -rf test1 [email protected]:~/test$ ls t1 test2 [email protected]:~/test$ rmdir test2/ [email protected]:~/test$ ls t1
tar命令使用
常用于打包,压缩和解压,使用和参数相关,其中 c指的是打包,x是提取,z指的是gzip压缩,j指的是bzip压缩,v显示解压过程,C是指定目录,这里指要解压到的目录。将目录test1打包,注意后接的参数顺序,显示打包的名字,后才是目录名
[email protected]:~/test$ tar -cvf test.tar test1/ test1/ test1/t2 [email protected]:~/test$ ls t1 test1 test.tar 将打包的文件提取到指定目录下,-C实现 [email protected]:~/test$ tar -xvf test.tar -C ./test1/ test1/ test1/t2 [email protected]:~/test$ ls ./test1/ t2 test1 gzip压缩与解压 [email protected]:~/test$ tar -czvf test.tar.gz test1/ [email protected]:~/test$ tar -xzvf test.tar.gz bzip2压缩与解压 [email protected]:~/test$ tar -cjvf test.tar.bz test1/ tar -xjvf test.tar.bz test1/
文件相关
显示文件内容
包括 cat,more,less,head,tail,nl等内部命令可实现,但略微不同
cat
将文件串联输出到stdout,一般输出在终端,常用参数包括
–n,功能和nl类似即同时输出行号。
more
可用于浏览超过一页或者超过终端显示长度的文件内容,通过空格键进行翻页,Enter键可行阅览,Q键退出,文本显示在终端
less
可用于浏览超过一页或者超过终端显示长度的文件内容,通过空格键进行翻页,Enter键可行阅览,上下箭头可前进或者后退,Q键退出,文本显示在独立开启的模式下
head
后接参数
–n 10,当然10可以更改,指的是显示文本的前10行
tail
后接参数 -n 10,同上,指的是显示文本的后10行
nl
类似于 cat -n
[email protected]:~/test$ cat t1 hello world !!! END gujinjin [email protected]:~/test$ head -n 1 t1 hello [email protected]:~/test$ tail -n 2 t1 END gujinjin [email protected]:~/test$ nl t1 1 hello 2 world 3 !!! 4 END 5 gujinjin [email protected]:~/test$ cat -n t1 1 hello 2 world 3 !!! 4 5 END 6 gujinjin [email protected]:~/test$ more t1 hello world !!! END gujinjin
文本流处理与使用
文本流模式是Linux的核心思想之一,因而命令可以组合形成更强大的功能。处理文本的命令很多,这里笔者主要介绍此时此刻想到的,不足还请见谅!
这里要提一下 awk
命令,即文本处理器,比较强大和神奇,由贝尔实验室的A,W,K三位搞出来的,入门还是相当容易的,这里有一个陈皓老师的文章,发布于酷壳网(CoolShell.cn),网址如下,感兴趣的可以看下:
http://coolshell.cn/articles/9070.html
特殊符号介绍 “|” 管道符,连接一个程序的输出和另一个程序的输入通路 “>”“>>” 重定向,输出到指定文件,区别是前者输出并涵盖文件原有内容,后者输出添加到文件尾部 grep (global search regular expression(RE) and print out the line), 参数 –o 指的是仅输出匹配对象,不输出完整行 示例: 输出IP地址 [email protected]:~/test$ ifconfig | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' 192.168.229.200 192.168.229.255 255.255.255.0 127.0.0.1 255.0.0.0 cut 顾名思义,即将输入文本进行移除处理并输出 示例,将IP地址分段,将上述输出存入 ip.log文件 参数解释: -s 不输出不包含指定分隔符的行, -d 指定分隔符, -f 输出指定的段,可多个,如 –f1,3 表示输出1,3 段 [email protected]:~/test$ cat ip.log | cut -s -d. -f1 192 192 255 127 255 sort 即排序,这里常用两个参数,即 –n 基于数值大小排序,一般升序; -r 反向,即reverse 加n和不加还是有点区别的,这里为了展示这个区别,对ip.log进行稍微修改,注意区别,其实即当做数值处理和字符串处理的区别: [email protected]:~/test$ cat ip.log | cut -s -d. -f1 | sort 127 192 192 20 255 255 [email protected]:~/test$ cat ip.log | cut -s -d. -f1 | sort -n 20 127 192 192 255 255 [email protected]:~/test$ cat ip.log | cut -s -d. -f1 | sort -nr 255 255 192 192 127 20 uniq 唯一,这里常用一个参数 –c, 用于计数,这里指上下行相同的 [email protected]:~/test$ cat ip.log | cut -s -d. -f1 | sort | uniq -c 1 127 2 192 1 20 2 255 awk 使用初探, -F 后接分隔符, $1代表第一个分段,具体用法参见上述说明的连接。 [email protected]:~/test$ awk -F. '$1>127 && $1<255 {print $0}' ip.log 192.168.229.200 192.168.229.255
文本处理示例
统计历史命令使用次数最多的前10个
[email protected]:~/test$ history | awk '{print $2}' | sort | uniq -c | sort -nr | head -n 10 255 ls 168 clear 79 cd 64 history 60 sh 48 sudo 46 cat 22 vim 20 clea 19 tree
哈哈哈,发现了啥,clea居然有20次,可见clear命令经常打错啊~
权限相关
权限管理体系在Linux中非常完善,这也是Linux很少受到黑客攻击的原因之一。一般常用的三个命令,即改边文件权限的
chmod, chown, chgrp
chmod 变更文件权限,一般分为可读,可写,可执行3种,即 r - 4, w - 2,x - 1, - - 0,同时结合文件所有者 u – User, g – Group, o – Other, a – All 用户群使用, 下述三个命令等效 [email protected]:~/test/test1$ chmod ugo=rwx t2 [email protected]:~/test/test1$ chmod a=rwx t2 [email protected]:~/test/test1$ chmod 777 t2 [email protected]:~/test/test1$ ll t2 -rwxrwxrwx 1 king king 10240 2014-08-23 19:27 t2* chown 变更文件所有者,也可以改变用户组 [email protected]:~/test/test1$ sudo chown root t2 [email protected]:~/test/test1$ ll t2 -rwxrwxrwx 1 root king 10240 2014-08-23 19:27 t2* [email protected]:~/test/test1$ sudo chown root:root t2 [email protected]:~/test/test1$ ll t2 -rwxrwxrwx 1 root root 10240 2014-08-23 19:27 t2* chgrp 改变文件所在的用户组 [email protected]:~/test/test1$ sudo chgrp root t2 [email protected]:~/test/test1$ ll t2 -rwxrwxrwx 1 king root 10240 2014-08-23 19:27 t2*
网络相关
ifconfig 查看网络配置信息 netstat 提供TCP连接,TCP、UDP监听,进程内存管理,路由表信息等,同时也可以查看端口信息。常用参数 –r 输出路由表信息, -i 网络接口 interface信息,-a 显示所有socket [email protected]:~/test/test1$ netstat -a | grep tcp | head -n 1 tcp 0 0 *:ssh *:* LISTEN lsof list open files,列出当前系统打开文件工具,一般在root权限下使用。如查看 80端口的相关进程信息: [email protected]:~# lsof -i:80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME apache2 987 root 3u IPv4 4423 0t0 TCP *:www (LISTEN) apache2 3899 www-data 3u IPv4 4423 0t0 TCP *:www (LISTEN) apache2 3900 www-data 3u IPv4 4423 0t0 TCP *:www (LISTEN) apache2 3901 www-data 3u IPv4 4423 0t0 TCP *:www (LISTEN) apache2 3902 www-data 3u IPv4 4423 0t0 TCP *:www (LISTEN) apache2 3903 www-data 3u IPv4 4423 0t0 TCP *:www (LISTEN) nc NetCat,网络工具,功能强大,可用于端口监测 参数说明: -4 仅IPv4, -6 仅IPv6, -v 输出执行过程, -w 允许延迟时间(s) , -z 仅扫描监听守护进程不发送消息, -u UDP协议默认为TCP [email protected]:~$ nc -v -w 2 -z 192.168.229.200 76-80 nc: connect to 192.168.229.200 port 76 (tcp) failed: Connection refused nc: connect to 192.168.229.200 port 77 (tcp) failed: Connection refused nc: connect to 192.168.229.200 port 78 (tcp) failed: Connection refused nc: connect to 192.168.229.200 port 79 (tcp) failed: Connection refused Connection to 192.168.229.200 80 port [tcp/www] succeeded!
------------------------
Bash Shell具体实现示例------------------------
这里列举几个常用的小例子,算是对Shell语法的基本回顾吧
对指定时间内某作者修改文件指定字符串的查看
#!/bin/bash res=`ls -l | awk '$3=="king" && $6=="2014-08-23" && $7<"22:10" && NR!=1 {print $8}'` #echo $res for var in $res;do r=`cat ./$var | grep -n -w 'test' >> mod.log` #echo $var if [ $? -ne 0 ];then echo "Execute CMD error!!!" exit 1 fi done exit 0 [email protected]:~/Shell$ sudo sh p1.sh [email protected]:~/Shell$ cat mod.log 1:this is a test this is a test 6:this is a test this is a test
对启动某个进程后台运行,然后完成操作后关闭进程
#!/bin/bash DIR=/home/king/CPPFile/Socket echo $DIR if [ -e $DIR/server ];then $DIR/server & > info.log 2>&1 if [ $? -ne 0 ];then echo "Execute Wrong!" exit 1 fi sleep 2 pid=$! echo $pid kill -9 $pid if [ $? -ne 0 ];then echo "fail to kill pid" exit 2 fi fi exit 0 [email protected]:~/CPPFile/Socket$ sudo sh test.sh /home/king/CPPFile/Socket 16028