文件内容查阅
个人在实践中有较深的印象的命令 参数会有额外的说明,其他均来自 鸟叔的Linux私房菜。
- cat 由第一行开始显示文件内容
- tac 从最后一行开始显示,可以看出 tac 是 cat 的倒著写!
- nl 显示的时候,顺道输出行号!
- more 一页一页的显示文件内容
- less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
- head 只看头几行
- tail 只看尾巴几行
- od 以二进位的方式读取文件内容!
以上是常用的查看一个文件的命令。
cat 的选项和参数
-A :相当於 -vET 的整合选项,可列出一些特殊字符而不是空白而已;
-b :列出行号,仅针对非空白行做行号显示,空白行不标行号!
-n :列印出行号,连同空白行也会有行号,与 -b 的选项不同;
-E :将结尾的断行字节 $ 显示出来;
-T :将 [tab] 按键以 ^I 显示出来;
-v :列出一些看不出来的特殊字符
nl 的选项和参数
[root@www ~]# nl [-bnw] 文件
选项与参数:
-b :指定行号指定的方式,主要有两种:
-b a :表示不论是否为空行,也同样列出行号(类似 cat -n);
-b t :如果有空行,空的那一行不要列出行号(默认值);
-n :列出行号表示的方法,主要有三种:
-n ln :行号在萤幕的最左方显示;
-n rn :行号在自己栏位的最右方显示,且不加 0 ;
-n rz :行号在自己栏位的最右方显示,且加 0 ;
-w :行号栏位的占用的位数。
范例一:用 nl 列出 /etc/issue 的内容
[root@www ~]# nl /etc/issue
1 CentOS release 5.3 (Final)
2 Kernel \r on an \m
# 注意看,这个文件其实有三行,第三行为空白(没有任何字节),
# 因为他是空白行,所以 nl 不会加上行号喔!如果确定要加上行号,可以这样做:
[root@www ~]# nl -b a /etc/issue
1 CentOS release 5.3 (Final)
2 Kernel \r on an \m
3
# 呵呵!行号加上来罗~那么如果要让行号前面自动补上 0 呢?可这样
[root@www ~]# nl -b a -n rz /etc/issue
000001 CentOS release 5.3 (Final)
000002 Kernel \r on an \m
000003
# 嘿嘿!自动在自己栏位的地方补上 0 了~默认栏位是六位数,如果想要改成 3 位数?
[root@www ~]# nl -b a -n rz -w 3 /etc/issue
001 CentOS release 5.3 (Final)
002 Kernel \r on an \m
003
# 变成仅有 3 位数罗~
more(一页一页翻动)
- 空白键 (space):代表向下翻一页;
- Enter :代表向下翻『一行』;
- /字串 :代表在这个显示的内容当中,向下搜寻『字串』这个关键字;
- :f :立刻显示出档名以及目前显示的行数;
- q :代表立刻离开 more ,不再显示该文件内容。
- b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。
less(一页一页翻动)
键盘的上下键可以一行一行的往下面翻
- 空白键 :向下翻动一页;
- [pagedown]:向下翻动一页;
- [pageup] :向上翻动一页;
- /字串 :向下搜寻『字串』的功能;
- ?字串 :向上搜寻『字串』的功能;
- n :重复前一个搜寻 (与 / 或 ? 有关!)
- N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
- q :离开 less 这个程序;
head (取出前面几行)
|
head 和 tail 后面的正负数字可能会混淆。我们这里定义从上到下为正方向(+)
这个可以看做是这样的,head 我从头开始列出来 要多少行的数据都是正向的,但是我不想要所有的数据尤其不想要最后n行,那么就是正方向上来个负方向(-),所以 head -n -10 filename 就是从头开始输出,再去掉最后的10行。
tail (取出后面几行)
|
tail同head的说法类似,tail -n 20 filename 我需要最后的20行数据。但是突然我尤其不想要最前面的10行数据,我又不知道总行数是多少,所以我们就可以 tail -n +10 filename,意思就是 我从尾开始取,从下到上负方向取完的话就是整篇的数据了,但是我不想要最前面的10条,所以我要去掉。那么要减少负方向的变动,就是取它的负值(+10)。
这里有个例题:
假如我想要显示 /etc/man.config 的第 11 到第 20 行呢?
11<=n<=20,思路就是:我先取前面20条再在20条数据里面排除最前面的10条。
head -n 20 /etc/man.config | tail -n 10 中间的 | 符号是管道的意思,咱们可以理解为过滤。
非纯文字档: od
[root@www ~]# od [-t TYPE] 文件
选项或参数:
-t :后面可以接各种『类型 (TYPE)』的输出,例如:
a :利用默认的字节来输出;
c :使用 ASCII 字节来输出
d[size] :利用十进位(decimal)来输出数据,每个整数占用 size bytes ;
f[size] :利用浮点数值(floating)来输出数据,每个数占用 size bytes ;
o[size] :利用八进位(octal)来输出数据,每个整数占用 size bytes ;
x[size] :利用十六进位(hexadecimal)来输出数据,每个整数占用 size bytes ;
范例一:请将/usr/bin/passwd的内容使用ASCII方式来展现!
[root@www ~]# od -t c /usr/bin/passwd
0000000 177 E L F 001 001 001 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000020 002 \0 003 \0 001 \0 \0 \0 260 225 004 \b 4 \0 \0 \0
0000040 020 E \0 \0 \0 \0 \0 \0 4 \0 \0 \a \0 ( \0
0000060 035 \0 034 \0 006 \0 \0 \0 4 \0 \0 \0 4 200 004 \b
0000100 4 200 004 \b 340 \0 \0 \0 340 \0 \0 \0 005 \0 \0 \0
.....(后面省略)....
# 最左边第一栏是以 8 进位来表示bytes数。以上面范例来说,第二栏0000020代表开头是
# 第 16 个 byes (2x8) 的内容之意。
范例二:请将/etc/issue这个文件的内容以8进位列出储存值与ASCII的对照表
[root@www ~]# od -t oCc /etc/issue
0000000 103 145 156 164 117 123 040 162 145 154 145 141 163 145 040 065
C e n t O S r e l e a s e 5
0000020 056 062 040 050 106 151 156 141 154 051 012 113 145 162 156 145
. 2 ( F i n a l ) \n K e r n e
0000040 154 040 134 162 040 157 156 040 141 156 040 134 155 012 012
l \ r o n a n \ m \n \n
0000057
# 如上所示,可以发现每个字节可以对应到的数值为何!
# 例如e对应的记录数值为145,转成十进位:1x8^2+4x8+5=101。
修改文件时间或建置新档: touch
[root@www ~]# touch [-acdmt] 文件
选项与参数:
-a :仅修订 access time;
-c :仅修改文件的时间,若该文件不存在则不创建新文件;
-d :后面可以接欲修订的日期而不用目前的日期,也可以使用 --date="日期或时间"
-m :仅修改 mtime ;
-t :后面可以接欲修订的时间而不用目前的时间,格式为[YYMMDDhhmm]
范例一:新建一个空的文件并观察时间
[root@www ~]# cd /tmp
[root@www tmp]# touch testtouch
[root@www tmp]# ls -l testtouch
-rw-r--r-- 1 root root 0 Sep 25 21:09 testtouch
# 注意到,这个文件的大小是 0 呢!在默认的状态下,如果 touch 后面有接文件,
# 则该文件的三个时间 (atime/ctime/mtime) 都会升级为目前的时间。若该文件不存在,
# 则会主动的创建一个新的空的文件喔!例如上面这个例子!
范例二:将 ~/.bashrc 复制成为 bashrc,假设复制完全的属性,检查其日期
[root@www tmp]# cp -a ~/.bashrc bashrc
[root@www tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
-rw-r--r-- 1 root root 176 Jan 6 2007 bashrc <==这是 mtime
-rw-r--r-- 1 root root 176 Sep 25 21:11 bashrc <==这是 atime
-rw-r--r-- 1 root root 176 Sep 25 21:12 bashrc <==这是 ctime
文件默认权限:umask
目前使用者在创建文件或目录时候的权限默认值。
[root@www ~]# umask
0022 <==与一般权限有关的是后面三个数字!
[root@www ~]# umask -S
u=rwx,g=rx,o=rx
如果创建的是文件则默认的是 -rw-rw-rw- 也就是666,文件默认没有执行权限。
如果创建的是文档则默认的是 drwxrwxrwx 也就是777
然后默认值需要减去umask的值文件就变成了644,文档755
[root@www ~]# umask
0022
[root@www ~]# touch test1
[root@www ~]# mkdir test2
[root@www ~]# ll
-rw-r--r-- 1 root root 0 Sep 27 00:25 test1
drwxr-xr-x 2 root root 4096 Sep 27 00:25 test2
修改umask的话可以直接 umask 002 就可以修改了
那umask到底运用的场景是在哪里?
如果多个人同group多人需要在同一个目录下工作,管理员如果用默认的umask,那么其他的用户创建的文件只有本人才能修改,同group的其他人并不能操作这就不符合需求了。所以需要管理员设置umask 002
umask的配置可以在 /etc/bashrc 修改,但是不建议修改。
chattr (配置文件隐藏属性)
|
lsattr (显示文件隐藏属性)
|
文件特殊权限: SUID, SGID, SBIT
|
我们会发现,tmp 和 passwd的权限和其他的不一样。这个在之后的几章中有详细介绍,所以现在看个大概。
Set UID
当s出现在拥有者的x的位置上的时候,文件的权限状态被称为set UID,简称SUID的权限。
- SUID 权限仅对二进位程序(binary program)有效;
- 运行者对於该程序需要具有 x 的可运行权限;
- 本权限仅在运行该程序的过程中有效 (run-time);
- 运行者将具有该程序拥有者 (owner) 的权限。
如果一个文件对某个用户(小明)来说是有x权限的,但是文件的拥有者是root这个账号,所以小明在运行的时候会暂时借用root这个账号的权限,所以小明就可以修改(w)这个文件了。
Set GID
|
和SUID同理。
- SGID 对二进位程序有用;
- 程序运行者对於该程序来说,需具备 x 的权限;
- 运行者在运行的过程中将会获得该程序群组的支持!
事实上 SGID 也能够用在目录上
- 使用者若对於此目录具有 r 与 x 的权限时,该使用者能够进入此目录;
- 使用者在此目录下的有效群组(effective group)将会变成该目录的群组;
- 用途:若使用者在此目录下具有 w 的权限(可以新建文件),则使用者所创建的新文件,该新文件的群组与此目录的群组相同。
Sticky Bit
SBIT 对於目录的作用是:
- 当使用者对於此目录具有 w, x 权限,亦即具有写入的权限时;
- 当使用者在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件
换句话说:当甲这个使用者於 A 目录是具有群组或其他人的身份,并且拥有该目录 w 的权限, 这表示『甲使用者对该目录内任何人创建的目录或文件均可进行 "删除/更名/搬移" 等动作。』 不过,如果将 A 目录加上了 SBIT 的权限项目时, 则甲只能够针对自己创建的文件或目录进行删除/更名/移动等动作,而无法删除他人的文件。