linux笔记3(过滤器、管道、常用文件管理操作指令)
过滤器
Linux中的应用工具
Linux中的应用工具分为三种:交互工具,过滤器,编辑器
输入:过滤器的数据来源
输出:过滤器的数据去向
重定向:标准输入、输出与错误输出,都可用特定符号改变数据来源或去向。
标准输入、标准输出、标准错误输出,例:
[root@redhat root]# ls -l /dev/std*
lrwxrwxrwx 1 root root 17 2011-10-25 /dev/stderr -> ../proc/self/fd/2
lrwxrwxrwx 1 root root 17 2011-10-25 /dev/stdin -> ../proc/self/fd/0
lrwxrwxrwx 1 root root 17 2011-10-25 /dev/stdout -> ../proc/self/fd/1
以上分别人标准输入(stdin(0))、标准输出(stdout(1))、标准错误输出(stderr(2)),所指向的文件。
输入重定向:
使用"<"来重定向输入源,大多数据工具都会以其后的文件名作为输入源,例:
[root@redhat a]# cat test.txt
HELLO WORLD !
I AM LUOWEI !
WELCOME TO LINUX'S WORLD !
[root@redhat a]# tr 'A-Z' 'a-z' < test.txt 将test.txt文件中的内容中的大写改变成小写输出
hello world !
i am luowei !
welcome to linux's world !
[root@redhat a]#
从当前文档输入:使用 << 让系统将一次键盘的全部输入,先送入虚拟的"当前文档",再一次性输入。
需要一对字母、符号或字符串作为起始终结符。可以选择任意符号作为起始终结标识符。例:
[root@redhat a]# cat test2.txt
[root@redhat a]# cat > test2.txt <<!
> this is test.
> writted by luowei !
> !
[root@redhat a]# cat test2.txt
this is test.
writted by luowei !
[root@redhat a]#
输出重定向:
例:
[root@redhat a]# ls -l > test3.txt 将输出的内之余输出到test3.txt文件中
[root@redhat a]# cat test3.txt
总用量 20
drwxrwxr-- 2 root root 4096 10月 25 00:32 a_dir
drwxr-xr-x 2 root root 4096 10月 25 00:32 b_dir
-rw-rw-r-- 1 root root 34 10月 25 01:14 test2.txt
-rw-r--r-- 1 root root 0 10月 25 01:17 test3.txt
-rw-r--r-- 1 root root 206 10月 25 01:04 test.txt
请尝试执行'ls --help'来获取更多信息。
[root@redhat a]# ls --help >>test3.txt
[root@redhat a]# cat test3.txt 把输出的内容追加到test3.txt
总用量 20
drwxrwxr-- 2 root root 4096 10月 25 00:32 a_dir
drwxr-xr-x 2 root root 4096 10月 25 00:32 b_dir
-rw-rw-r-- 1 root root 34 10月 25 01:14 test2.txt
-rw-r--r-- 1 root root 0 10月 25 01:17 test3.txt
-rw-r--r-- 1 root root 206 10月 25 01:04 test.txt
用法:ls [选项]... [文件]...
列出<文件>的信息 (默认为目前的目录)。
如果不指定 -cftuSUX 或 --sort 任何一个选项,则根据字母大小排序。
长选项必须用的参数在使用短选项时也是必须的。
-a, --all 不隐藏任何以 . 字符开始的项目
-A, --almost-all 列出除了 . 及 .. 以外的任何项目
………….
[root@redhat a]# ls-l 2>test.txt 将标准错误输出到文件中,在">"符号前加个"2"
[root@redhat a]# cat test.txt
-bash: ls-l: command not found
[root@redhat a]# su - luowei
[luowei@redhat luowei]$ find /etc -name passwd > stdout
find: /etc/sysconfig/pgsql: 权限不够
find: /etc/default: 权限不够
find: /etc/httpd/conf/ssl.crl: 权限不够
find: /etc/httpd/conf/ssl.crt: 权限不够
find: /etc/httpd/conf/ssl.csr: 权限不够
find: /etc/httpd/conf/ssl.key: 权限不够
find: /etc/httpd/conf/ssl.prm: 权限不够
find: /etc/cups/certs: 权限不够
[luowei@redhat luowei]$ cat stdout
/etc/passwd
/etc/pam.d/passwd
[luowei@redhat luowei]$ find /etc -name passwd 2>stderr
/etc/passwd
/etc/pam.d/passwd
[luowei@redhat luowei]$ cat stderr
find: /etc/sysconfig/pgsql: 权限不够
find: /etc/default: 权限不够
find: /etc/httpd/conf/ssl.crl: 权限不够
find: /etc/httpd/conf/ssl.crt: 权限不够
find: /etc/httpd/conf/ssl.csr: 权限不够
find: /etc/httpd/conf/ssl.key: 权限不够
find: /etc/httpd/conf/ssl.prm: 权限不够
find: /etc/cups/certs: 权限不够
[luowei@redhat luowei]$
双重定向输入输出
例:
[luowei@redhat luowei]$ find /etc -name passwd 2> stderr > stderr > stdout
[luowei@redhat luowei]$ cat stderr
find: /etc/sysconfig/pgsql: 权限不够
find: /etc/default: 权限不够
find: /etc/httpd/conf/ssl.crl: 权限不够
find: /etc/httpd/conf/ssl.crt: 权限不够
find: /etc/httpd/conf/ssl.csr: 权限不够
find: /etc/httpd/conf/ssl.key: 权限不够
find: /etc/httpd/conf/ssl.prm: 权限不够
find: /etc/cups/certs: 权限不够
[luowei@redhat luowei]$ cat stdout
/etc/passwd
/etc/pam.d/passwd
[luowei@redhat luowei]$ ls
stderr stdout test.txt
[luowei@redhat luowei]$
将正确定的输出信息与错误的信息输出到同一个地方(文件)
[luowei@redhat luowei]$ find /etc -name passwd &> allout
[luowei@redhat luowei]$ cat allout
find: /etc/sysconfig/pgsql: 权限不够
/etc/passwd
find: /etc/default: 权限不够
/etc/pam.d/passwd
find: /etc/httpd/conf/ssl.crl: 权限不够
find: /etc/httpd/conf/ssl.crt: 权限不够
find: /etc/httpd/conf/ssl.csr: 权限不够
find: /etc/httpd/conf/ssl.key: 权限不够
find: /etc/httpd/conf/ssl.prm: 权限不够
find: /etc/cups/certs: 权限不够
使用 &> 也可所有的输入都送到同一个地方
[luowei@redhat luowei]$ find /etc -name passwd &> allout > allout 2>&1
[luowei@redhat luowei]$
管道
使用 | 将前现代战争过滤器的输出直接送入后一个过滤器的输入。
例:
允许多重管道
注意管道前过滤器的输出与管道后过滤器的输入数据类型匹配。
例:
[root@redhat root]# ls -l /etc |more 列出目录并实现翻页的效果
[root@redhat root]# ls -l /etc |more |grep fstab 使用多重管道
拷贝
[root@redhat root]# echo "hello" > filea
[root@redhat root]# cat filea
hello
[root@redhat root]# touch fileb
[root@redhat root]# cat < filea > fileb 把filea里的内容拷贝到fileb
[root@redhat root]# cat fileb
hello
[root@redhat root]#
将多个文件的内容输出合并到同一个文件
[root@redhat root]# cat filea;cat fileb 查看两个文件的内容
hello
hello
[root@redhat root]# cat filea fileb > file 将filea与fileb的内容输出到file
[root@redhat root]# cat file
hello
hello
[root@redhat root]# echo "hello luowei" > fileb
[root@redhat root]# cat file* > file 将当前目录下以file打头的文件内容输出到file
cat: file: input file is output file
[root@redhat root]# cat file
hello
hello luowei
[root@redhat root]#
文件查找与文件管理
可执行文件的搜索
Which whereis 指令
例:
[root@redhat root]# which ls 显示ls的完整路径
alias ls='ls --color=tty'
/bin/ls
[root@redhat root]# echo $PATH 系统路径
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin
[root@redhat root]# alias ls 指示了指令ls --color=tty别名为ls
[root@redhat root]# whereis ls 显示ls的路径及该文件的一些相关帮助信息
ls: /bin/ls /usr/share/man/man1/ls.1.gz
[root@redhat root]#
Slocate 指令 显示含有关键字的所有文件名以及所在路径包含有关键字的文件与目录都会显示。
[root@redhat root]# ls -l /usr/bin/locate
lrwxrwxrwx 1 root slocate 7 10月 25 00:57 /usr/bin/locate -> slocate
[root@redhat root]#slocat passwd
/var/lib/menu/kde/Applications/Preferences/redhat-userpasswd.desktop
/var/www/manual/programs/htpasswd.html
/etc/sysconfig/yppasswdd
/etc/passwd
……
find [路径] [参数]
从指定路径下递归向下搜索文件
支持按照各种条件方式搜索
支持对搜索到的文件进一步用指定操作
例:
[root@redhat root]# find /root -user root 在root目录下查找拥有者是root的文件
[root@redhat root]# find /etc -user luowei 在ect目录下查找拥有者是luowei的文件
[root@redhat root]# find /etc -name services 在ect目录下查找文件名是services的文件
[root@redhat root]# find /etc -size +1000k 在ect目录下查找文件大于1000k的文件
[root@redhat root]# find /etc -size -1000k 在ect目录下查找文件小于1000k的文件
[root@redhat root]# find /root -type f 在ect目录下查找正规的文件
[root@redhat root]# find /dev -type b 在ect目录下查找块设备文件
[root@redhat root]# find /dev -type l 在ect目录下查找链接文件
[root@redhat root]# find /dev -type c 在ect目录下查找字符文件
[root@redhat root]# find /etc -nouser 在ect目录下查找没有拥有者文件
[root@redhat root]# find /etc -nogroup 在ect目录下查找没有群组文件
[root@redhat root]# find /home -perm 0644 的/home目录下查找权限是读写读读的文件
[root@redhat root]# su - luowei
[luowei@redhat luowei]$ mkdir test
[luowei@redhat luowei]$ cd test
[luowei@redhat test]$ touch 6000 创建文件名为6000的文件
[luowei@redhat test]$ touch 2000 创建文件名为2000的文件
[luowei@redhat test]$ touch 6600 创建文件名为6600的文件
[luowei@redhat test]$ touch 4000 创建文件名为4000的文件
[luowei@redhat test]$ ls
2000 4000 6000 6600
[luowei@redhat test]$ chmod 2000 2000 给2000文件设置了gid
[luowei@redhat test]$ chmod 4000 4000 给4000文件设置了uid
[luowei@redhat test]$ chmod 6000 6000 给6000文件设置了gid和uid
[luowei@redhat test]$ chmod 6600 6600 给6600文件设置了gid和uid
[luowei@redhat test]$ ls -l
总用量 0
------S--- 1 luowei luowei 0 10月 26 00:24 2000
---S------ 1 luowei luowei 0 10月 26 00:24 4000
---S--S--- 1 luowei luowei 0 10月 26 00:24 6000
-rwS--S--- 1 luowei luowei 0 10月 26 00:24 6600
[luowei@redhat test]$ find /home/luowei/test -perm 6000 查找权限为6000的文件
/home/luowei/test/6000
[luowei@redhat test]$ find /home/luowei/test -perm -6000 加'-' 表示查找文件权限与6000相与运算后权限仍为6000的文件
[luowei@redhat test]$ find /home/luowei/test -perm +6000 加'+' 表示查看文件权限与6000相或运算后权限仍为这个文件的权限的文件
操作找到的文件
语法:
-find [路径] [参数]
-exec 指令 {} \;
-{} 代表find找到的文件
-\ 禁止转意
-; 表示本行指令结束
例:
[root@redhat root]# find /home/luowei/test -perm 6000 -exec chown test1.test {} \;
在/home/luowei/test目录下找权限为6000的文件,并将它改为test组下的test1用户
[root@redhat root]# ls -l /home/luowei/test
总用量 0
------S--- 1 luowei luowei 0 10月 26 00:24 2000
---S------ 1 luowei luowei 0 10月 26 00:24 4000
---S--S--- 1 test1 test 0 10月 26 00:24 6000
-rwS--S--- 1 luowei luowei 0 10月 26 00:24 6600
常用的文件操作指令
wc
统计文件中的行数,字数,占用字节数
例:
[root@redhat root]# wc test1.txt
8 40 149 test1.txt
8表示这个文件中的字符行数,40表示这个文件中的字数,149表示这个文件所占用的字节数,最后一个是文件名
grep
显示文件中匹配关键字的行
例:
[root@redhat root]# grep "2011" test1.txt 显示test1.txt文件中含有"2011"的行
十月 2011
[root@redhat root]# grep -n "2011" test1.txt 显示test1.txt文件中含有"2011"的行及行号
1: 十月 2011
[root@redhat root]# grep -v "2011" test1.txt 显示test1.txt文件中不含有"2011"的行
日 一 二 三 四 五 六
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
Sort
按序重排文本并送回显示
例:
[root@redhat root]# sort -t: -k3 /etc/passwd 以冒号为分隔,对第3栏进行排序
diff
报告文本差异内容
例:
[root@redhat root]# diff test1.txt test2.txt
4,5c4,5 表示两个文件的第4行和第5行有不一样
< 02 3 4 5 6 7 8 "<"表示第一个文件test1.txt
< 09 10 11 12 13 14 15
---
> 2 3 4 5 6 7 8 ">"表示第二个文件test2.txt
> 9 10 11 12 13 14 15
cmp
报告文本差异位置
例:
[root@redhat root]# cmp test1.txt test2.txt
test1.txt test2.txt differ: byte 60, line 4 在文件中第60个字节、第4行处出现了不同
uniq
去除文件中重复的行
例:
[root@redhat root]# vi test1.txt
十月 2011
日 一 二 三 四 五 六
1
1
02 3 4 5 6 7 8
09 10 11 12 13 14 15
09 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
~
"test1.txt" 10L, 191C 已写入
[root@redhat root]# uniq test1.txt 去除test1.txt中的重复行
十月 2011
日 一 二 三 四 五 六
1
02 3 4 5 6 7 8
09 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
cut
显示文件中的某一列
例:
[root@redhat root]# vi cut_test
l u o
w e i
1 2 3
a b c
~
"cut_test" [新] 4L, 24C 已写入
[root@redhat root]# cut -f3 cut_test 显示cut_test第3列的内容
o
i
3
c
[root@redhat root]# vi cut1
luowei@test.com
luowei,luowei@test.com
admin,admin@test.com
[root@redhat root]# cut -f2 -d, cut1 显示cut1中以 , 分隔的第2列的内容
luowei@test.com
admin@test.com
[root@redhat root]# cut -c4-8 cut1 显示cut1中第4-8个字符
wei,l
in,ad
paste
将文本按列拼接
例:
[root@redhat root]# paste test1.txt test2.txt > test3.txt 将两个文件的内容水平拼接到test3.txt
[root@redhat root]# cat test3.txt
十月 2011 十月 2011
日 一 二 三 四 五 六 日 一 二 三 四 五 六
1 1
1 2 3 4 5 6 7 8
02 3 4 5 6 7 8 9 10 11 12 13 14 15
09 10 11 12 13 14 15 16 17 18 19 20 21 22
09 10 11 12 13 14 15 23 24 25 26 27 28 29
16 17 18 19 20 21 22 30 31
23 24 25 26 27 28 29
30 31
[root@redhat root]# cat test1.txt test2.txt > test4.txt 将两个文件的内容垂直拼接到test4.txt
[root@redhat root]# cat test4.txt
十月 2011
日 一 二 三 四 五 六
1
1
02 3 4 5 6 7 8
09 10 11 12 13 14 15
09 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
十月 2011
日 一 二 三 四 五 六
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31