[置顶] Shell常用命令总结

key.test使用

1. 关于某个档名的『类型』侦测(存在与否),如 test -e filename 

-e  该『档名』是否存在?(常用) 

-f  该『档名』是否为档案(file)?(常用) 

-d  该『文件名』是否为目录(directory)?(常用) 

-b  该『文件名』是否为一个 block device 装置? 

-c  该『文件名』是否为一个 character device 装置? 

-S  该『档名』是否为一个 Socket 档案? 

-p  该『档名』是否为一个 FIFO (pipe) 档案? 

-L  该『档名』是否为一个连结档? 

2. 关于档案的权限侦测,如 test -r filename 

-r  侦测该文件名是否具有『可读』的属性? 

-w  侦测该档名是否具有『可写』的属性? 

-x  侦测该档名是否具有『可执行』的属性? 

-u  侦测该文件名是否具有『SUID』的属性? 

-g  侦测该文件名是否具有『SGID』的属性? 

-k  侦测该文件名是否具有『Sticky bit』的属性? 

-s  侦测该档名是否为『非空白档案』? 

3. 两个档案之间的比较,如: test file1 -nt file2 

-nt  (newer than)判断 file1 是否比 file2 新 

-ot  (older than)判断 file1 是否比 file2 旧 

-ef  判断 file2 与 file2 是否为同一档案,可用在判断 hard link 的判定上。 主要意义在判定,两个档案是否均指向同一个 inode 哩! 

4. 关于两个整数之间的判定,例如 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) 

5. 判定字符串的数据 

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 

6. 多重条件判定,例如: test -r filename -a -x filename 

-a  (and)两状况同时成立!例如 test -r file -a -x file,则 file 同时具有 r 与 x 权限时,才回传 true。 

-o  (or)两状况任何一个成立!例如 test -r file -o -x file,则 file 具有 r 或 x 权限时,就可回传 true。 

!  反相状态,如 test ! -x file ,当 file 不具有 x 时,回传 true 

key.sort

sort [-fbMnrtuk] [file or stdin] 

-f  :忽略大小写的差异,例如 A 与 a 视为编码相同; 

-b  :忽略最前面的空格符部分; 

-M  :以月份的名字来排序,例如 JAN, DEC 等等的排序方法; 

-n  :使用『纯数字』进行排序(预设是以文字型态来排序的); 

-r  :反向排序; 

-u  :就是 uniq ,相同的数据中,仅出现一行代表; 

-t  :分隔符,预设是 tab 键; 

-k  :以那个区间 (field) 来进行排序的意思,

key.uniq  

如果我排序完成了,想要将重复的资料仅列出一个显示

范例二:如果我还想要知道每个人的登入总次数呢? 

[root@linux ~]# last | cut -d ' ' -f1 | sort | uniq -c 

例子:取HTTPD访问最多的前十个IP

awk '{print $1}' /etc/httpd/logs/access_log |sort|uniq -c|sort -k1 -n -r|head -n10

key.head 

-n10 前十条

key.cut 

-d'分隔字符' -f fields

范例一:将 /etc/passwd 内的第一栏取出,仅取三行,使用 finger 这个指令将每个 

        账号内容秀出来 

[root@linux ~]# cut -d':' -f1 < /etc/passwd |head -n 3| xargs finger 

key.paste

[root@linux ~]# paste [-d] file1 file2 

参数: 

-d  :后面可以接分隔字符。预设是以 [tab] 来分隔的! 

-   :如果 file 部分写成 - ,表示来自 standard input 的资料的意思。 

范例一:将 /etc/passwd 与 /etc/shadow 同一行贴在一起 

[root@linux ~]# paste /etc/passwd /etc/shadow 

key.split

[root@linux ~]# split [-bl] file PREFIX 

参数: 

-b  :后面可接欲分割成的档案大小,可加单位,例如 b, k, m 等; 

-l  :以行数来进行分割。 

范例一:我的 /etc/termcap 有七百多K,若想要分成 300K 一个档案时? 

[root@linux ~]# cd /tmp; split -b 300k /etc/termcap termcap 

[root@linux tmp]# ls -l termcap* 

-rw-rw-r--  1 root root  307200  8月 17 00:25 termcapaa 

-rw-rw-r--  1 root root  307200  8月 17 00:25 termcapab 

-rw-rw-r--  1 root root  184848  8月 17 00:25 termcapac 

key.join 

[-ti12] file1 file2 

-t  :join 预设以空格符分隔数据,并且比对『第一个字段』的数据, 

      如果两个档案相同,则将两笔数据联成一行,且第一个字段放在第一个! 

-i  :忽略大小写的差异; 

-1  :这个是数字的 1 ,代表『第一个档案要用那个字段来分析』的意思; 

-2  :代表『第二个档案要用那个字段来分析』的意思。 

范例一:用 root 的身份,将 /etc/passwd 与 /etc/shadow 相关数据整合成一栏 

[root@linux ~]# join -t ':' /etc/passwd /etc/shadow 

key.sed

a   :新增, a 的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行)~ 

c   :取代, c 的后面可以接字符串,这些字符串可以取代 n1,n2 之间的行! 

d   :删除,因为是删除啊,所以 d 后面通常不接任何咚咚; 

i   :插入, i 的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行); 

p   :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运作~ 

s   :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配 

      正规表示法!例如 1,20s/old/new/g 就是啦! 

key.awk 

awk '条件类型1{动作1} 条件类型2{动作2} ...' filename

变量名称  代表意义 

NF  每一行 ($0)  拥有的字段总数 

NR  目前 awk  所处理的是『第几行』数据 

FS  目前的分隔字符,预设是空格键 

例子: awk '{if(NR==1) printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"} 

NR>=2{total = $2 + $3 + $4 

printf "%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}'

使用正则:awk 'BEGIN {FS=":"} $0~/root/' /etc/passwd 

key.grep 

[-acinv] '搜寻字符串' filename

-a :将 binary 档案以 text 档案的方式搜寻数据 

-c :计算找到 '搜寻字符串' 的次数 

-i :忽略大小写的不同,所以大小写视为相同 

-n :顺便输出行号 

-v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!

范例:grep 'root' /var/log/secure (将 /var/log/secure 这个档案中有 root 的那一行秀出来)

key.regular expression正则表达式

^word 待搜寻的字符串(word)在行首! 

范例:grep -n '^#' regular_express.txt  搜寻行首为 # 开始的那一行! 

word$ 待搜寻的字符串(word)在行尾! 

范例:grep -n '!$' regular_express.txt  将行尾为 ! 的那一行打印出来! 

.  代表『任意一个』字符,一定是一个任意字符! 

范例:grep -n 'e.e' regular_express.txt 

搜寻的字符串可以是 (eve) (eae) (eee) (e e), 但不能仅有 (ee) !亦即 e  与 e 

中间『一定』仅有一个字符,而空格符也是字符!

\  跳脱字符,将特殊符号的特殊意义去除! 

范例:grep -n \' regular_express.txt  搜寻含有单引号 ' 的那一行!  

* 重复零个或多个的前一个 RE 字符 

\{n,m\}  连续 n 到 m  个的『前一个 RE 字符』 

若为 \{n\} 则是连续 n 个的前一个 RE  字符, 

若是 \{n,\} 则是连续 n  个以上的前一个 RE  字符!  范例:grep -n 'go\{2,3\}g' regular_express.txt 

在 g  与 g  之间有 2  个到 3  个的 o  存在的字符串,亦即 (goog)(gooog) 

[]  1 [list]  范例:grep -n 'g[ld]' regular_express.txt 

2 [ch1-ch2] 范例:grep -n '[0-9]' regular_express.txt 

3 [^]  范例:grep -n 'oo[^t]' regular_express.txt 

扩展正则表达式

+    重复『一个或一个以上』的前一个 RE  字符

?  『零个或一个』的前一个 RE 字符 

|    用或( or )的方式找出数个字符串

()   找出『群组』字符串

fuser  

fuser [-ki] [-signal] file/dir 

-k  :找出使用该档案/目录的 PID ,并试图以 SIGKILL 这个讯号给予该 PID; 

-i  :必须与 -k 配合,在删除 PID 之前会先询问使用者意愿!

lsof

 [-Uu] [+d] 

-a  :多项数据需要『同时成立』才显示出结果时! 

-U  :仅列出 Unix like 系统的 socket 档案类型; 

-u  :后面接 username,列出该使用者相关程序所开启的档案; 

+d  :后面接目录,亦即找出某个目录底下已经被开启的档案!  

pidof

 [-sx] program_name  

-s  :仅列出一个 PID 而不列出所有的 PID 

-x  :同时列出该 program name 可能的 PPID 那个程序的 PID 

LINUX C总结

gcc 命令参数:

-c   只激活预处理、编译和汇编,生成obj文件;不链接生成可执行文件 

-E   只激活预处理,不生成文件,可重定向到文件里查看

-S   只激活预处理和编译,源文件生成汇编代码 

-o   生成目标文件

-Wall   显示警告信息

-Werror    将警告转换为错误

-O[0,1...]   编译器优化选项

-g              编译时产生调试信息

 -ansi         关闭gnu c中与ansi c不兼容的特性

-pedantic   以ANSI/ISO C标准列出的所有警告

-march=i686  指定CPU型号

GCOV

编译增加:gcc -fprofile-arcs -ftest-coverage srcfile.c -o srcfile

gcc  --coverage 也行 可增加-g3 -O0

2:运行一遍

3:运行 gcov srcfile就可以了

gprof

1. gcc -pg srcfile.c -o srcfile

2. 运行程序

3. 执行命令 gprof –b ./srcfile

make

目标的(target): 目标文件1 目标文件2 

<tab>   gcc -o 欲建立的执行文件 目标文件1 目标文件 2 

与 bash shell script 的语法有点不太相同,变量的基本语法为:  

1.  变量与变量内容以『=』隔开,同时两边可以具有空格;  

2.  变量左边不可以有 <tab> ,例如上面范例的第一行 LIBS 左边不可以是 <tab>;  

3.  变量与变量内容在『=』两边不能具有『:』;  

4.  在习惯上,变数最好是以『大写字母』为主;  

5.  运用变量时,以 ${变量} 或 $(变量) 使用;  

6.  在该 shell 的环境变量是可以被套用的,例如提到的 CFLAGS 这个变数!  

7.  在指令列模式也可以给予变量。 

•  $@:代表目前的标的(target) 

相关推荐