[置顶] 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)