Linux命令这么多,怎么玩?

Linux命令这么多,记不住,怎么玩?

Linux命令虽然非常多,但是:

  1. 工作中需要用到的,毕竟是有限的呀(一般300个上下);
  2. 而且常用的,还是很有限的呀(一般在150个上下);
  3. 比较常用的呢,更少(一般在80个上下)
  4. 非常常用的呢,则是少之又少(约三四十个吧)
  5. 超高频率使用的Linux命令,更是只有十来个呀——
    比如下面所列这些非常常用的命令中的红色部分,算是超高频吧
    1】sudo2】su,3】pwd, 4】ls, 5】cd,
    6】vi, 7】rm,8】find,9】wc  10】chmod
    11】cat, 12】grep, 13】sed,14】tar,15】mount
    16】fdisk,17】ip,18】ss,19】ps,20】useradd,
    21】passwd,22】chown,23】df,24】du...
    说到底除了|、>、<、.、&、()之类的不算
    而真正最高频的其实就几个:ls,cd,vi,rm,cp,chmod,cat,grep,tar,sudo...

下面我就带大家来玩一下Linux命令

一、命令范围、命令类别、命令帮助与bash特性

【1】Linux中的命令有多少

你的Linux上有多少个可用的命令呢?我们在 CL 中 输入compgen -c就知道了

~]# component -c
...
cp
curlbd
digbd
grep
ifa
l.
ll
ls
mv
pingbd
...
sqlite3
comm
db_stat
lesskey
gdbus
yum
gpg
zsoelim
newaliases.postfix
newaliases
...
~]# 

好多哦,具体有多少呢?我们用wc命令来统计一下行数就知道了

~]# component -c | wc -l
1160

显示是有一千来个

这些命令,基于上位于/bin, /sbin, /usr/bin, /usr/sbin这几个目录下——即命令的搜索路径下,我们可以先来看一下PATH系统或shell参数的值

~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
~]# 
~]# ls /sbin
addpart              dmsetup         grub-terminfo            kpartx        mke2fs               pvscan       thin_delta
agetty               dmstats         halt                     ldconfig      mkfs                 rdisc        thin_dump
arp                  dracut          hwclock                  load_policy   mkfs.cramfs          reboot       thin_ls
arping               dumpe2fs        ifcfg                    logsave       mkfs.ext2            reload       thin_metadata_size
audispd              e2fsck          ifconfig                 losetup       mkfs.ext3            resize2fs    thin_repair
auditctl             e2image         ifdown                   lsinitrd      mkfs.ext4            restart      thin_restore
auditd               e2label         ifenslave                lsmod         mkfs.ext4dev         restorecon   thin_rmap
augenrules           e2undo          ifup                     lspci         mkhomedir_helper     rmmod        thin_trim
...略
~]# 

是不是有好多命令呀,仅/sbin下就二百多个呢?

~]# ls /sbin | wc -l
251
~]# 

总之呢,compgen -c命令,告诉我们,我们的Linux系统上有一千多个命令,echo $PATH,我们可以看到PATH变量定义的命令搜索路径,我们的命令CMDs就放在这些路径下,其中以s开头的目录如/sbin,通常放的都是些系统级的命令,而不是s开头的,比如/bin通常放的是一些用户引进的三方命令。

【2】命令类别和内建命令

Linux命令,可以简单地分为两类:内部命令和外部命令。

我们可以使用type命令来检测一个命令是否属于内部命令,如果是,则会显示builtin信息,否则就不显示builtin。比如我们用type来测试一下man和help两个命令:

~]# type man
man is /usr/bin/man
~]# type help
help is a shell builtin
~]# 

显然,man是外部命令,而help是内部命令。

我们同样使用compgen命令,带上-b选项,来列举出所有的内建命令了。

~]# compgen -b
.
:
[
alias
bg
bind
break
builtin
caller
cd
command
compgen
complete
。。。
dirs
disown
echo
enable
eval
。。。
help
history
jobs
kill
let
local
logout
。。。
type
typeset
ulimit
umask
unalias
unset
wait
~]# compgen -b | wc -l
61
~]# 

而且,我们很容易就知道了Linux或bash自带的内建命令,有61个。

所谓内建命令,就是它们是linux或shell自带的,不需要去搜索命令搜索路径(即不在命令搜索路径下),即可直接运行的命令,这样的命令是shell进程的一部分,调用的是shell内部的函数或功能,所以不用另开线程去执行,执行效率上比外部命令更高、也更稳定和安全。

内部命令的使用是可以启用或禁用的,我们使用enable -a或直接enable就可以看到所有的内部命令了

~]# enable 
。。。
。。。
enable ulimit
enable umask
enable unalias
enable unset
enable wait
~]#

我们可以通常enable -n来禁用一个指定的内建命令,也可以通过enable来直接启用一个封禁的内建命令。

~]# enable -n unalias #禁用unalias命令
~]# 
~]# enable | tail -5
enable typeset
enable ulimit   #禁用后,ulimit命令后看不到alias命令了
enable umask
enable unset
enable wait
~]# enable unalias #重新启用
~]# enable | tail -5
enable ulimit
enable umask
enable unalias   #unalais命令又出现了
enable unset
enable wait
~]# 

我们可以通过输入help直接回车,得到help命令的基本用法或简易语法清单

~]# help
。。。

A star (*) next to a name means that the command is disabled.

 job_spec [&]                                                                history [-c] [-d offset] [n] or history -anrw [filename] or history -ps >
 (( expression ))                                                            if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else >
 . filename [arguments]                                                      jobs [-lnprs] [jobspec ...] or jobs -x command [args]
 :                                                                           kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [s>
 [ arg... ]                                                                  let arg [arg ...]
 [[ expression ]]                                                            local [option] name[=value] ...
 alias [-p] [name[=value] ... ]                                              logout [n]
 bg [job_spec ...]                                                           mapfile [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c>
 bind [-lpvsPVS] [-m keymap] [-f filename] [-q name] [-u name] [-r keyseq]>  popd [-n] [+N | -N]
 break [n]                                                                   printf [-v var] format [arguments]
 builtin [shell-builtin [arg ...]]                                           pushd [-n] [+N | -N | dir]
 caller [expr]                                                               pwd [-LP]
 case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac                  read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p >
 cd [-L|-P] [dir]                                                            readarray [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [>
 command [-pVv] command [arg ...]                                            readonly [-af] [name[=value] ...] or readonly -p
 compgen [-abcdefgjksuv] [-o option]  [-A action] [-G globpat] [-W wordlis>  return [n]
 complete [-abcdefgjksuv] [-pr] [-DE] [-o option] [-A action] [-G globpat]>  select NAME [in WORDS ... ;] do COMMANDS; done
 compopt [-o|+o option] [-DE] [name ...]                                     set [--abefhkmnptuvxBCHP] [-o option-name] [arg ...]
 continue [n]                                                                shift [n]
 coproc [NAME] command [redirections]                                        shopt [-pqsu] [-o] [optname 
。。。
。。。
~]# 

可以通过 help CMD 获得指定内建的具体用法,比如 help alias 我们就可以显示得到内建命令 alias 的具体用法。

~]# help alias
alias: alias [-p] [name[=value] ... ]
    Define or display aliases.

    Without arguments, `alias' prints the list of aliases in the reusable
    form `alias NAME=VALUE' on standard output.

    Otherwise, an alias is defined for each NAME whose VALUE is given.
    A trailing space in VALUE causes the next word to be checked for
    alias substitution when the alias is expanded.

    Options:
      -p        Print all defined aliases in a reusable format

    Exit Status:
    alias returns true unless a NAME is supplied for which no alias has been
    defined.
~]# 

man命令和info命令不能用来获取指定的内建命令的帮助信息,但可以得到整个bash的内建命令的一份用法清单或手册,我们以 info alias为例,只要是 man或info命令后接某个内建命令名都会出现这份清单。man和info显示的内容都是一样的,info援引的man的内容,只是info显示得更窄一点、半屏显示的样子。

~]# info alias

File: *manpages*,  Node: alias,  Up: (dir)

BASH_BUILTINS(1)                                              BASH_BUILTINS(1)



NAME
       bash,  :,  .,  [, alias, bg, bind, break, builtin, caller, cd, command,
       compgen, complete, compopt,  continue,  declare,  dirs,  disown,  echo,
       enable,  eval,  exec, exit, export, false, fc, fg, getopts, hash, help,
       history, jobs, kill, let, local, logout, mapfile, popd, printf,  pushd,
       pwd,  read, readonly, return, set, shift, shopt, source, suspend, test,
       times, trap, true, type, typeset, ulimit, umask, unalias, unset, wait -
       bash built-in commands, see bash(1)

BASH BUILTIN COMMANDS
       Unless otherwise noted, each builtin command documented in this section
       as accepting options preceded by - accepts -- to signify the end of the
       options.   The  :, true, false, and test builtins do not accept options
       and do not treat -- specially.  The exit, logout, break, continue, let,
       and  shift builtins accept and process arguments beginning with - with-
       out requiring --.  Other builtins that accept  arguments  but  are  not
       specified  as accepting options interpret arguments beginning with - as
       invalid options and require -- to prevent this interpretation.
       : [arguments]
              No effect; the command does nothing beyond  expanding  arguments
              and  performing any specified redirections.  A zero exit code is
              returned.

        .  filename [arguments]
       source filename [arguments]
              Read and execute commands from filename  in  the  current  shell
              environment  and return the exit status of the last command exe-
              cuted from filename.  If filename does not contain a slash, file
              names  in  PATH  are used to find the directory containing file-
              name.  The file searched for in PATH  need  not  be  executable.
              When  bash  is  not  in  posix  mode,  the  current directory is
              searched if no file is found in PATH.  If the sourcepath  option


...
... 按q退出
~]#

事实上,如果我们要获得Linux命令的帮助信息,大体上可以这样做:

  1. CMD CMD #获取 内部命令 帮助信息
  2. CMD --help #获取 外部命令 简易帮助信息
  3. man CMD #获取 外部命令 用法指南或手册页
  4. info CMD #获取 外部命令  GNU语法文档信息

当然,你也可以上网查,但以上显示的命令语法帮助信息,显然是最为权威的。

【3】Bash特性 —— 效率至上,唯快不破

Bash是sh,csh,ksh的集大成者。在原有shell特性的基础上,又开发出了许多自己独有的特性。

  • sh,指Bourne Shell
  • csh,指C Shell
  • ksh,指K Shell

总之,我们将它都可以笼罩地称之为Bash特性,毕竟Bash兼容了原有shell的特性。

Bash特性,让使用Bash的人变得非常顺手和高效,有点唯快不破的意思。

1)自动补全

比如,你可以通常连接两次Tab键来实现命令或路径的自动补全,而按Tab键实现补全,其实就是调用的compgen内建命令的功能。比如 compgen -w "abc bcd aaa axy" a,就为会a列出在-W中指定字串中匹配到的补全名单(注意选项-W是大写的W)

~]# compgen -W "abc bcd aaa axy" a
abc
aaa
axy
~]# 

2)命令历史

除了自动补全,Bash还提供了History基础设施,支持history,fc等使用历列举敲过的历史命令,

~]# history      #显示所有命令历史记录
...
...
 1050  info alias
 1051  compgen -w "abc bcd aaa axy" a
 1052  compgen -W "abc bcd aaa axy" a
 1053  c
 1054  history
~]# 
~]# history 10        #显示最近10条历史命令
 1047  c
 1048  help alias
 1049  man alias
 1050  info alias
 1051  compgen -w "abc bcd aaa axy" a
 1052  compgen -W "abc bcd aaa axy" a
 1053  c
 1054  history
 1055  c
 1056  history 10
~]# 
~]# fc -l   #默认显示最近16条
1042     enable | tail -5
1043     enable unalias
1044     enable | tail -5
1045     c
1046     help
1047     c
1048     help alias
1049     man alias
1050     info alias
1051     compgen -w "abc bcd aaa axy" a
1052     compgen -W "abc bcd aaa axy" a
1053     c
1054     history
1055     c
1056     history 10
1057     fc -l 4
~]# 
~]# fc -l 1045 1050        #限定显示第1045到1050条的命令历史记录
1045     c
1046     help
1047     c
1048     help alias
1049     man alias
1050     info alias
~]# 

并支持以Bang(!)的方式进行历史命令扩展(history expansion)

~]# !he
help alias
alias: alias [-p] [name[=value] ... ]
    Define or display aliases.

    Without arguments, `alias' prints the list of aliases in the reusable
    form `alias NAME=VALUE' on standard output.

    Otherwise, an alias is defined for each NAME whose VALUE is given.
    A trailing space in VALUE causes the next word to be checked for
    alias substitution when the alias is expanded.

    Options:
      -p        Print all defined aliases in a reusable format

    Exit Status:
    alias returns true unless a NAME is supplied for which no alias has been
    defined.
~]# 

注意:扩展(expansion),通常也翻译成 展开

3)命令缓存,又称命令hash

Linux会将执行过的外部命令进行hash缓存。hash是指基于hash算法的hash索引库,这种数据库的哈希索引,在搜索时非常高效。

哪些命令在使用后,被hash库缓存过呢?我们可以通过hash或hash -l可以查看

~]# hash -l
builtin hash -p /usr/bin/tabs tabs
builtin hash -p /bin/vi vi
builtin hash -p /usr/bin/man man
builtin hash -p /usr/bin/info info
builtin hash -p /bin/ls ls
builtin hash -p /usr/bin/clear clear
~]# 
~]# hash
hits    command
   1    /usr/bin/tabs
   1    /bin/vi
   1    /usr/bin/man
   1    /usr/bin/info
   1    /bin/ls
~]# 

我们可以看到,缓存的核心内容,是命令的全路径,通常hash命令,我们还可以看到命令缓存后再次使用被命中的次数。

4)命令别名:alias

当你通过 敲 cd /etc/sysconfig/network-script/进行目录切换时,另一个小朋友却只是敲了cdnet几个字符,就实现了同样的切换,你会不会觉得有点亏。

tmp]# cd /etc/sysconfig/network-scripts/
network-scripts]#
network-scripts]#
network-scripts]#cd -
/tmp
tmp]# cdnet
network-scripts]# alias | grep cdnet
alias cdnet='cd /etc/sysconfig/network-scripts/'
network-scripts]# 

定义命令别名非常简单,就是:alias 参数

比如上面我们用到的cdnet别名,就可以如下进行定义:

~]# 
~]# alias cdnet='cd /etc/sysconfig/network-script/'
~]# 

当然,这只是定义的临时别名,如果我们关闭shell,它就消失了。临时命令别名,可以通过 “unalias 别名”进行取消。

如果我们们要定义永久别名,只需要将它添加到/etc/profile或者~/.bashrc当中就可以了,二者的区别在于:

  • 如果是家目录下的~/.bashrc,只对个别用户有效
  • 如果是添加在/etc/profile中,则对所有用户都有效

我们来试一下就好了

]# echo "alias cdnet='cd /etc/sysconfig/network-script/'"> /etc/profile
]# 
]# source /etc/profile     #需要刷新一下配置
]# 

是否生效,我们试一下就好了,因为命令别名的使用,和普通命令基本上是一样的。

5)目录栈:pushd,dirs,popd

Bash还提供了目录堆栈的功能特性,Bash会自动将当前目录放入该目录栈的栈顶,当用户切换目录时,又会将新的工作目录放入栈顶,原来的弹出去。

真正要使用好目录栈功能特性,我们需要了解pushd,dirs和popd三个内建命令。

首先,我们可以简单地定义一下命令别名,比如:

~]# alias a=alias
~]# 
~]# a c=clear
~]# a cls=clear
~]# 
~]# a p='pushd `pwd`'
~]# 

这样我们就拥有了一堆简洁的命令别名了,比如c、cls、p,这些别名,其实也是命令。我们用compgen -c是可以看到。

p命令很简单,功能就是在切换到一个新目录后,我们输入p,一回车,就把当前的工作全路径压到目录栈中去了。比如:

network-scripts]# alias p='pushd `pwd`'
network-scripts]# 
network-scripts]# cd /tmp
tmp]# p
/tmp /tmp
tmp]# cd /var
var]# p
/var /var /tmp
var]# cd /usr
usr]# p
/usr /usr /var /tmp
usr]# dirs -v
 0  /usr
 1  /usr
 2  /var
 3  /tmp
usr]# cdnet
network-scripts]# p
/etc/sysconfig/network-scripts /etc/sysconfig/network-scripts /usr /var /tmp
network-scripts]# dirs -v
 0  /etc/sysconfig/network-scripts
 1  /etc/sysconfig/network-scripts
 2  /usr
 3  /var
 4  /tmp
network-scripts]# pushd +3
/tmp /etc/sysconfig/network-scripts /etc/sysconfig/network-scripts /usr /var
tmp]# dirs -v
 0  /tmp
 1  /etc/sysconfig/network-scripts
 2  /etc/sysconfig/network-scripts
 3  /usr
 4  /var
tmp]# pushd +1
/etc/sysconfig/network-scripts /etc/sysconfig/network-scripts /usr /var /tmp
network-scripts]# 

看到没有,我们可以用dirs -v查看当前目录栈里都压了些什么,用pushd +N(N是栈中目录条目的序号)实现目录的快速跳转或切换。当然如果我们想将栈中的哪个路径条目剔除,可以使用popd +N即可实现。

二、极客命令

我给Linux中1~3个字符的常用命令,称为极客命令。

称之为极客命令,是因为它符合Linux简洁高效的思想。

比如我们说Linux的“一切皆文件”、“用文本文件进行配置”等思想,

根本目的或灵魂都是想达到“简洁+高效”,文件或文本本身不是智慧,

但如果一样东西能达到“简洁+高效”,那它就是智慧——你能理解这一点吗?

【1】1符和2符命令

这些极客命令非常简洁,数量算起来却也不算少,使用频度却很高。

比方说一个字符的命令:

  • w:这个命令是who命令的加强版,显示的是当前登录用户及他们在做的事情
  • .:这个元字符,或者英文句点,放在命令行或者语句的第一个位置时,
  • 是一个命令,它的作用等效于source命令。
  • |:这个元字符,也是一个命令,叫管道命令。作用是将上一个命令的输出结果,
  • 作为下一个命令的读取输入
  • >或<:这个是重定向命令
  • &:这个是用来将命令发送后台执行的意思

单个字符的命令非常少,但两个字符的常用命令,可就不少了,比如:

序号命令说明备注
1sh这个是个软链接,实际指向/bin/bash
2()这个是用来开辟子shell用的
3ls英文就是list,列举目录内容的意思
4llll是ls的一个别名,相当于ls -l
5l.这个如果存在,也是ls的别名
6cd这个是change directory即切换目录的意思
7id显示用户的uid、gid等信息
8suswitch user,切换用户的意思
9vivi编辑器,或vim的别名
10nl带行号显示文件内容
11rm删除文件或目录。rm -rf / 这是经典的面向监狱运维
12cp拷贝
13mv移动或重命名文件目录
14tr转换或删除字符
15wc字词统计
16od八进制或其它进制编码转储
17at一次性定时任务
18dd底层机制的复制,0 1 形式的副本拷贝
19ln创建链接。如果想创建软件接,简单,带上-s吧
20df磁盘或文件系统的空闲情况
21du磁盘或文件目录的使用情况
22ip网络配置命令
23ss替代netstat,网络统计
24nc一款多功能网络工具
25ps进程快照。ps -ef,经典用法之一
26fg作业送至前台
27bg作业发至后台
28fc这个是命令历史(history)的一个剪辑命令
29bc浮点运算
30nm这个是看库文件符号用的,看调用了哪些函数
31rz如果你安装了lrzsz上传下载工具。这个是上传命令
32sz如果你安装了lrzsz上传下载工具。这个是下载命令
33as这个是汇编器,as就是assemble的意思
34其它比如xz压缩、pr打印、ar、dc等

【2】3符命令:

man (1)              - 一个在线参考手册的接口

cls					 - clear命令的定制别名


tty (1)              - 打印连接到标准输入的终端的文件名

who (1)              - 显示谁登录了系统

cal (1)              - 显示日历


set (1)              - Bash内建变量:设置/更改Shell属性和位置参数的值,或显示Shell变量的名称和值。

env (1)              - 在修改后的环境中运行程序


pwd (1)              - 打印当前/工作目录的名称

dir (1)              - 列出目录内容


cat (1)              - 连接文件并在标准输出上打印

tac (1)              - 反向连接和打印文件


tee (1)              - 从标准输入读取并写入标准输出和文件


cut (1)              - 从每行文件中删除节

col (1)              - 从输入过滤反向换行

rev (1)              - 反转一个或多个文件的行

fmt (1)              - 简单优化文本格式化程序

cmp (1)              - 逐字节比较两个文件

seq (1)              - 打印一系列数字


tar (1)              - GNU‘tar’将许多文件一起保存到一个磁带或磁盘归档中,并可以从归档中恢复单个文件。


let (1)              - Bash内建变量:计算算术表达式。


arp (8)				 - 操作系统ARP缓存

top (1)              - 显示Linux进程

ldd					 - 列出动态依赖库(List dynamic dependencies)

sum (1)              - 校验和并计算文件中的块



vim (1)               - Vi-IMCroved,程序员文本编辑器


sed (1)              - 用于过滤和转换文本的流编辑器

awk (1)              - 模式扫描与处理语言


rpm (8)              - RPM包管理器

yum (8)              - YUM是一个基于RPM的交互式的包管理器



yes (1)              - 重复输出字符串直到终止




lvm (8)              - lvm2 工具

pvs (8)              - 显示有关物理卷的信息

vgs (8)              - 显示有关卷组的信息

lvs (8) 			 - 报告/显示有关逻辑卷的信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值