# grep $LOGNAME /etc/passwd //显示当前登录用户使用的shell
# sh //启动bsh(为Bourne Shell的简称---伯恩shell)
# bash //启动bash(为Bourne Again Shell的简称)
# csh //启动C Shell
# type [-tpa] name //bash shell的内置命令。
type:不加任何参数时,type会显示出name是外部命令还是bash内置命令
-t :当加入-t参数时,type会将name以下面这些字眼显示出它的意义:
file:表示为外部命令
alias:表示该命令为命令别名所设置的名称;
builtin:表示该命令为bash内置的命令功能。
-p :如果后面接的name为外部命令时,才会显示完整文件名;
-a :会由PATH变量定义的路径中,将所有含name的命令都列出来,包含alias
# cp /var/spool/mail/root /etc/crontab \
> /etc/fstab /root //将三个文件复制到root目录下(如果命令串太长的话,可以用两行来输出)。“\[Enter]”为转义符,“>”为系统自动出现的,不需要输入。
# source ~/.bashrc //将主文件夹的~/.bashrc的设置读入目前的bash环境中
# . ~/.bashrc //将主文件夹的~/.bashrc的设置读入目前的bash环境中
# ll -d /etc/cron* //找出/etc/下面以cron为开头的文件名
# ll -d /etc/????? //找出/etc/下面文件名刚好是五个字母的文件名
# ll -d /etc/*[0-9]* //找出/etc/下面文件名含有数字的文件名
# ll -d /etc/[^a-z]* //找出/etc/下面文件名开头非为小写字母的文件名
# cp -a /etc/[^a-z]* /tmp //将上例找到的文件复制到 /tmp中
# last | cut -d ' ' -f1 | sort //将输出的数据仅取账号,并加以排序
# last | cut -d ' ' -f1 | sort | uniq //将输出的数据仅取账号,排序后仅取出一位
# last | cut -d ' ' -f1 | sort | uniq -c //将输出的数据仅取账号,排序后仅取出一位并显示每个账号登录的总次数
# last | grep [a-zA-Z] | grep -v ‘wtmp’| wc -l //显示登录系统的总人数
# last | tee last.list | cut -d “ “ -f1 //将last的输出存一份到last.list文件中
# ls -l /home | tee ~/homefile | more //将ls的数据存一份到~/homefile,同时屏幕也有输出信息
# ls -l / | tee -a ~/homefile | more //加上-a参数则能将信息累加
# cp /etc/passwd /root/passwd && unix2dos /root/passwd
# file /etc/passwd /root/passwd
# cat /root/passwd | tr -d ‘\r’ > /root/passwd.linux
# ll /etc/passwd /root/passwd* //将/etc/passwd转存成dos断行到/root/passwd中,再将^M 符号删除。\r指的是dos的断行字符 ^M
# cat -A /etc/man.config
# cat /etc/man.config | col -x | cat -A | more //利用cat -A 显示所有特殊按键,最后以 col将[tab]转成空白。上面看到的^I符号就是tab,如此一来,[tab]按键会被替换成为空格键,输出就美观多了
# man col > /root/col.man
# vi /root/col.man
# man col | col -b > /root/col.man //将col的man page转存成为/root/col.man的纯文本文件
#############################################
通配符与特殊符号
符号 意义
* 代表『 0 个到无穷多个』任意字符
? 代表『一定有一个』任意字符
[ ] 同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』
[ - ] 若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表 0 到 9 之间的所有数字,因为数字的语系编码是连续的!
[^ ] 若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个字符,只要是非 a, b, c 的其他字符就接受的意思。
bash 环境中的特殊符号
符号 内容
# 批注符号:这个最常被使用在 script 当中,视为说明!在后的数据均不运行
\ 跳脱符号:将『特殊字符或通配符』还原成一般字符
| 管线 (pipe):分隔两个管线命令的界定(后两节介绍);
; 连续命令下达分隔符:连续性命令的界定 (注意!与管线命令并不相同)
~ 用户的家目录
$ 取用变量前导符:亦即是变量之前需要加的变量取代值
& 工作控制 (job control):将命令变成背景下工作
! 逻辑运算意义上的『非』 not 的意思!
/ 目录符号:路径分隔的符号
>, >> 数据流重导向:输出导向,分别是『取代』与『累加』
<, << 数据流重导向:输入导向
' ' 单引号,不具有变量置换的功能
" " 具有变量置换的功能!
` ` 两个『 ` 』中间为可以先运行的命令,亦可使用 $( )
( ) 在中间为子 shell 的起始与结束
{ } 在中间为命令区块的组合!
#############################################
# dmesg | grep -n -color=auto ‘eth’ //用dmesg列出内核信息,再以grep找出内含eth的那些行,并显色、加上行号
# dmesg | grep -n -A3 -B2 -color=auto ‘eth’ //承上,在关键字所在行的前两行与后三行也一起找出来显示
#############################################
基础正则表达式字符 (characters)
^word
意义:待查找的字符串(word)在行首
范例:查找行首为 # 开始的那一行,并列出行号
grep -n '^#' regular_express.txt
word$
意义:待查找的字符串(word)在行尾
范例:将行尾为 ! 的那一行列印出来,并列出行号
grep -n '!$' regular_express.txt
.
意义:代表一定有一个任意字符的字符
范例:查找的字符串可以是 (eve) (eae) (eee) (e e), 但不能仅有 (ee),亦即 e 与 e 中间“一定”仅有一个字符,而空格符也是字符
grep -n 'e.e' regular_express.txt
\
意义:转义字符,将特殊符号的特殊意义去除
范例:查找含有单引号 ' 的那一行
grep -n \' regular_express.txt
*
意义:重复零个到无穷多个的前一个 RE(regular)字符
范例:找出含有 (es) (ess) (esss) 等等的字符串,注意,因为 * 可以是 0 个,所以 es 也是符合带查找字符串。另外,因为 * 为重复“前一个 RE 字符”的符号, 因此,在 * 之前必须要紧接著一个 RE 字符喔。例如任意字符则为 “.*”
grep -n 'ess*' regular_express.txt
[list]
意义:从字符集合的 RE 字符里面找出想要选取的字符
范例:查找含有 (gl) 或 (gd) 的那一行,需要特别留意的是,在 [] 当中代表一个待查找的字符, 例如“ a[afl]y ”代表查找的字符串可以是 aay, afy, aly 即 [afl] 代表 a 或 f 或 l 的意思
grep -n 'g[ld]' regular_express.txt
[n1-n2]
意义:从字符集合的 RE 字符里面找出想要选取的字符范围
范例:查找含有任意数字的那一行。需特别留意,在字符集合 [] 中的减号 - 是有特殊意义的,他代表两个字符之间的所有连续字符。但这个连续与否与 ASCII 编码有关,因此,你的编码需要配置正确(在 bash 当中,需要确定 LANG 与 LANGUAGE 的变量是否正确)。例如所有大写字符则为 [A-Z]
grep -n '[A-Z]' regular_express.txt
[^list]
意义:从字符集合的 RE 字符里面找出不要的字符串或范围
范例:查找的字符串可以是 (oog) (ood) 但不能是 (oot) ,那个 ^ 在 [] 内时,代表的意义是“反向选择”的意思。例如,我不要大写字符,则为 [^A-Z]。但是,需要特别注意的是,如果以 grep -n [^A-Z] regular_express.txt 来查找,却发现该文件内的所有行都被列出,为什么?因为这个 [^A-Z] 是“非大写字符”的意思, 因为每一行均有非大写字符,例如第一行的 "Open Source" 就有 p,e,n,o等小写字符
grep -n 'oo[^t]' regular_express.txt
\{n,m\}
意义:连续 n 到 m 个的前一个 RE 字符,若为 \{n\} 则是连续 n 个的前一个 RE 字符,若是 \{n,\} 则是连续 n 个以上的前一个 RE 字符
范例:在 g 与 g 之间有2个到3个的o存在的字符串,亦即 (goog)(gooog)
grep -n 'go\{2,3\}g' regular_express.txt
======================================
# test -e /pa/lamprj && echo "exist" || echo "Not exist" //检查/pa/lamprj目录是否存在
======================================
文件测试的标志与意义:
关於某个文件名的“文件类型”判断,如 test -e filename 表示存在否
-e 该文件名是否存在?(常用)
-f 该文件名是否存在且为文件(file)(常用)
-d 该文件名是否存在且为目录(directory)(常用)
-b 该文件名是否存在且为一个 block device 设备
-c 该文件名是否存在且为一个 character device 设备
-S 该文件名是否存在且为一个 Socket 文件
-p 该文件名是否存在且为一个 FIFO (pipe) 文件
-L 该文件名是否存在且为一个连结文件
关於文件的权限检测,如 test -r filename 表示可读否 (但 root 权限常有例外)
-r 检测该文件名是否存在且具有“可读”的权限
-w 检测该文件名是否存在且具有“可写”的权限
-x 检测该文件名是否存在且具有“可执行”的权限
-u 检测该文件名是否存在且具有“SUID”的属性
-g 检测该文件名是否存在且具有“SGID”的属性
-k 检测该文件名是否存在且具有“Sticky bit”的属性
-s 检测该文件名是否存在且为“非空白文件”
两个文件之间的比较,如:test file1 -nt file2
-nt (newer than)判断 file1 是否比 file2 新
-ot (older than)判断 file1 是否比 file2 旧
-ef 判断 file1 与 file2 是否为同一文件,可用在判断 hard link 的判定上。 主要意义在判定两个文件是否均指向同一个 inode
关於两个整数之间的判定,例如 test n1 -eq n2
-eq 两数值相等 (equal)
-ne 两数值不等 (not equal)
-gt n1 大於 n2 (greater than)
-lt n1 小於 n2 (less than)
-ge n1 大於等於 n2 (greater than or equal)
-le n1 小於等於 n2 (less than or equal)
判定字串的数据
test -z string 判定字串是否为 0,若 string 为空字串,则为 true
test -n string 判定字串是否非为0,若 string 为空字串,则为 false
注:-n 亦可省略
test str1 = str2 判定 str1 是否等於 str2 ,若相等,则回传 true
test str1 != str2 判定 str1 是否不等於 str2 ,若相等,则回传 false
多重条件判定,例如:test -r filename -a -x filename
-a 两个条件同时成立!例如 test -r file -a -x file,则 file 同时具有 r 与 x 权限时,才回传 true
-o 任何一个条件成立!例如 test -r file -o -x file,则 file 具有 r 或 x 权限时,就可回传 true
! 反相状态,如 test ! -x file ,当 file 不具有 x 时,回传 true
=======
常用shell命令组合
# kudzu --probe --class=network //kudzu查看网卡型号
# ps -e -o "%C : %p : %z : %a"|sort -k5 -nr //查看进程,按内存从大到小排列
# ps -e -o "%C : %p : %z : %a"|sort -nr //按cpu利用率从大到小排列
# ls /etc/rc3.d/S* |cut -c 15- //显示运行3级别开启的服务(从中了解到cut的用途,截取数据)
# ifconfig eth0 |grep "inet addr:" |awk '{print $2}'|cut -c 6- //显示IP地址
# free -m |grep "Mem" | awk '{print $2}' //显示内存的大小
# cat /proc/cpuinfo |grep -c processor //显示CPU的数量
# mpstat 1 1 //显示CPU负载
# du -cks * | sort -rn | head -n 10 //显存当前路径下从大到小排序的前10个文件或目录大小
# iostat -x 1 2 //磁盘I/O负载
# sar -n DEV //网络负载
# ps aux | wc -l //进程总数