tmp2>&1等价于 ./a.out&>tmp./a.out2>&11>tmp等价于 ./a.out>" />
Unix实用命令.txt第一次笑是因为遇见你,第一次哭是因为你不在,第一次笑着流泪是因为不能拥有你。重定向
> 重定向stdout
&>重定向stdout和stderr
重定向顺序
int main(void){
printf("stdout\n");
perror("stderr\n");
return 0;
}
./a.out 1>tmp 2>&1 等价于 ./a.out &> tmp
./a.out 2>&1 1>tmp 等价于 ./a.out > tmp
stdout重定向到某个文件,stderr依然输出到屏幕
注意:
只有重定向符号<或>右边的文件描述符才加&而且&和描述符之间不能有空格。
管道
管道符"|"只是把stdout重定向,不包括stderr。"|&"也包括stderr。
T型管道 tee
tee 从stdin接收数据,输出到stdout,并将输出复制到文件。
参数 -a (append, 否则覆盖已有文件)
例子:snoop -ta -x54 port 33333 | tee -a tmp
转义,引用,元字符
shell中,转义和引用是一对相反的概念。
元字符:本身就具有特殊意义,如<>*?|&
对于普通字符,前面加上 \ 则转义,表示其它含义,如\n
对于元字符,前面加上 \ 则引用,表示该字符本身,如\*
大批量引用元字符时,\ 显得很麻烦,可以将元字符放在一对单引号里,任何在单引号中的字符都将保留原样。
例如echo a'****'b
输出 a****b
技巧:利用单引号删除文件名中存在空格的文件
touch ‘test file'
rm ‘test file'
history
列出最近10条命令 history 10 列出最近10条命令
列出最近10条man命令 history 100 | grep man
alias
为命令定义临时的别名
alias ll='ls -l'
察看所有别名: alias
察看别名ll: alias ll
取消所有别名: unalias -a
取消别名ll: unalias ll
alias和unalias的效果只是暂时的,不会修改.bashrc文件,重新运行shell就无效了。
注意:
只能定义shell命令的别名,而不作其他替换。比如
alias blackhole /dev/null
command &> blackhole
并不能把command的输出舍弃,而是会建一个blackhole文件,并把输出写进去。因为blackhole在这里不是命令,没被替换成/dev/null.
jobs
选项-l 显示后台进程的pid
jobs 列出当前所有的作业,例如:
[1]- Running tail -f ability &
[2]+ Stopped tail -f apology
ctrl-z可以发一个STOP信号,将正在前台运行的进程在后台挂起。
如果要将正在前台运行的进程在后台运行,用命令bg %作业号
将后台进程切到前台的命令是fg %作业号。
关于前台,后台和stopped的概念,man手册上描述如下:
1. A job in the foreground has read and write access to the controlling terminal.
2. A job in the background is denied read access and has conditional write access to the controlling terminal
3. A stopped job is a job that has
been placed in a suspended state, usually as a result of a SIGTSTP signal
当退出shell时,系统会向该shell的所有子进程发一个SIGHUP信号。如果不想在退出时被SIGHUP信号杀死,可以用nohup屏蔽该信号,例如:
nohup tail -f ability > tmp &
当退出后,原本应该输出到终端的数据会写入当前目录下一个叫nohup.out的文件中。
od查看二进制文件
od -选项 文件名
选项:
-v 输出时不省略重复的数据。否则会用 * 表示重复的数据。
d, o, u, x 每段两个字节
Signed decimal, octal, unsigned decimal, and hexade-
cimal, respectively.
-f 浮点数,每段四个字节
-c ASCII字符, 每段一个字节
可以同时查看一个文件的十六,十,八进制,浮点数,和ascii字符格式。
例如:
od -xdofc /etc/motd
0000000 5375 6e20 4d69 6372 6f73 7973 7465 6d73
21365 28192 19817 25458 28531 31091 29797 28019
051565 067040 046551 061562 067563 074563 072145 066563
1.0541146e+12 2.4472554e+08 7.5351680e+28 7.2708488e+31
S u n M i c r o s y s t e m s
0000020 2049 6e63 2e09 5375 6e4f 5320 352e 3909
08265 28259 11785 21365 28239 21280 13614 14601
020111 067143 027011 051565 067117 051440 032456 034411
1.7061886e-19 3.1224318e-11 1.6040972e+28 6.4903048e-07
I n c . \t S u n O S 5 . 9 \t
............
0000061
注意,前面的偏移量是八进制显示的。
/dev/null UNIX中的黑洞
/dev/null 是一个特殊的字符文件,任何写入这个文件的数据都会消失。从这个文件里读的任何数据都是0.
如果要舍弃stdout或stderr的输出,可将其重定向到/dev/null
舍弃stdout: command > /dev/null
舍弃stderr: command 2>/dev/null
舍弃stdout和stderr: command &> /dev/null
ls
选项
-i 显示inode编号。
-r reverse 反向排序。
-R recursive 递归处理,将指定目录下的所有文件及子目录一并处理。
-t 用文件和目录的更改时间排序,最近的在前,如果想让最早的在前,用-tr逆置。
-l中drwxr-xr-x第一个字符表示文件类型,含义如下:
d directory.
D door.
l symbolic link.
b block special file.
c character special file.
p FIFO (or "named pipe") special file.
s The entry is an AF_UNIX address family socket.
- The entry is an ordinary file.
注意:
ls * 列出当前目录及其直接子目录两个目录层次中的所有文件。
ls -R 则递归到底。
ln
硬链接
用ln命令或link系统调用
实现硬链接,硬链接的局限是文件必须位于同一个物理文件系统中。
硬链接与目标文件是同一个inode。即硬链接不是一个独立的文件,只是在创建硬连接的目录中增加一个文件名,如果用ls -l查看硬连接,它所有的属性都和目标文件相同。
符号链接
用ln -s命令或symlink系统调用实现符号链接。
符号链接是真正独立的数据文件,它所存放的数据就是目标文件的文件名。符号链接经常用来解决当前文件系统空间不足的问题,例如把实际文件放在另一个文件系统,而当前文件系统里只存放一个符号链接。
技巧:当程序用到的文件名必须一致,但又没有此文件,则可以用硬链接或者符号链接解决。
FIFO
管道文件(FIFO,也叫有名管道named pipe),FIFO拥有文件名和信息节点,但不拥有任何数据。可以用mknod
touch
touch
将filename的访问时间和修改时间变为当前时间。
当filename不存在时,创建一个新的空文件。
cat
例子:
cat > tmp
把从键盘输入得到的内容写进一个文件。回车换行,ctrl-d退出。ctrl-d是unix中的文件结束符。
cat file1 file2 >file3
把file1和file2的内容连到一起,写进file3
例:cat chap1 chap2 chap3 chap4 > user_guide
cat chap5 chap6 >> user_guide
cp
选项 -i :Interactive. prompt for confirmation when cp would overwrite an existing target.
选项 -f : 强制执行,不输出任何提示,常用于脚本中。
-i和-f选项在mv和 rm命令中也适用。
file
列出文件类型。
例如列出当前目录下所有文件类型:file *
Makefile: ascii text
clean: commands text
main: directory
slms_test: ELF 64-bit MSB executable SPARCV9 Version 1, dynamically linked, not stripped
ps
-e 显示所有进程
-f 显示重要信息
-u username 某个用户的进程
find
指定的条件可以是文件名(包含通配符),文件大小,文件类型,以及修改/访问日期等。
格式:find path-list predicate-list
选项:
-name
-size [+|-]n[c] 数字n 表示512字节的数据块,如果以字节,需要在数字后面加c。+n表示大于n,-n表示小于n。+-都没有表示恰巧等于n.
-type t t可以是:
f普通文件 d 目录 l 链接
b 块特殊文件 c 字符特殊 p 管道文件
-mtime n天 修改过的
-atime [+|-]n 访问过的
-ctime [+|-]n 文件状态信息变动过的
+n 距离今天n天之外
-n 距离今天n天之内
n 距离今天恰巧n天
-newer
-links
[+|-]n 链接数为(大于,等于,小于)n的
! -a -o not, and , or 组合条件必须加\( con1 -a con2 \)
其实-a完全没用,因为默认的列举多个条件就是找出满足所有条件的。-o可以用多次执行的方法实现。唯独!有点用处。
-exec command {} \+ 用command处理find所找到的文件,command可以是任何操作文件的命令,如rm, mv, cp, chmod等。因为参数个个数由上限,因此当处理的文件个数非常多时,建议用find ... | xargs command。
例子:
从当前目录开始找以map作为文件名结尾的文件
find . -name ‘*map'
从当前目录开始找大小恰等于32字节的文件:find . -size 32c
从用户home目录下开始查找所有大小超过1000*512字节的文件
find ~ -size +1000
从用户home目录下开始查找所有最近两天内修改的文件
find ~ -mtime -2
从当前目录开始找比main修改时间晚的文件
find . -newer main
从home目录开始找文件类型是目录,且文件名是src的文件
find ~ -type d - name src
删除该用户目录及子目录下所有的core,删除前提示一下,以免删错
find ~ -name core -exec rm -i {} \+
删除该用户目录及子目录下所有大于10M的文件,删除前提示一下,以免删错
find ~ -size +20000 -exec rm -i {} \+
文章汇总
find . -name 'chapter*' | sort | xargs cat > latest_version
找所有包含biz_com的.c和.h文件的行
find . -name '*.[ch]' | xargs grep biz_com
注意:
目录也是文件,因此以下所说的文件也包含目录。
find 从指定目录向下递归查找。
grep
找到包含匹配模式字符串的那一行,此命令常与管道搭配用来过滤。
选项:
-i 忽略大小写
-n 显示行号
-v 过滤掉所包含的pattern
例子:查找当前目录及其子目录下所有十月份修改的.c文件
find . -name '*.c' | xargs ls -l | grep Oct
查找段口号为33333并且状态值是ESTABLISHED的连接
netstat -an | grep 33333 | grep ESTA
查找段口号为33333并且状态值不是TIMED WAIT的连接
netstat -an | grep 33333 | grep -v ‘TIMED WAIT'