鸟哥私房菜
- 鸟哥私房菜
- 鸟哥私房菜之第五章
- 鸟哥私房菜之第六章1
- 鸟哥私房菜之第六章2
- 鸟哥私房菜之Linux文件和目录管理1
- 鸟哥私房菜之Linux文件和目录管理2
- 鸟哥私房菜之Linux文件和目录管理3
- 鸟哥私房菜之Linux 文件和目录管理4
- 鸟哥私房菜2nd之Linux磁盘与文件系统管理1
- 鸟哥私房菜2nd之Linux磁盘与文件系统管理2
- Arch
- 鸟哥私房菜2nd之Linux磁盘与文件系统管理3
- 鸟哥私房菜2nd之文件的压缩与打包
- 鸟哥私房菜2nd之Vi文字处理器1
- 鸟哥私房菜2nd之Vi文字处理器2
- 林夕昱作品鸟哥私房菜之认识bashshel 1
- 林夕昱作品鸟哥私房菜之认识bashshel 2
- 林夕昱作品鸟哥私房菜之认识bashshel 3
- 林夕昱作品鸟哥私房菜之认识bashshel 4
- 林夕昱作品鸟哥私房菜之认识bashshel 5
- 林夕昱作品鸟哥私房菜之认识bashshel 6
- 林夕昱作品鸟哥私房菜之认识bashshel 7
- 21林夕昱作品鸟哥私房菜之正则表达式1
- 林夕昱作品鸟哥私房菜之正则表达式2
- 林夕昱作品鸟哥私房菜之正则表达式3sed21
- 24林夕昱作品鸟哥私房菜之正则表达式4sed22
- 25林夕昱作品鸟哥私房菜之正则表达式 - 5
1.鸟哥私房菜之第五章
\
:如果命令过长,可以随时使用反斜杠换行
- cal
cal
:当前月份
cal 8 2015
cal 2015
- man
/string
:向下查找
?string
:向上查找
n
:同向继续搜索
N
:反向继续搜索
2.鸟哥私房菜之第六章1
umask
当我们登录系统之后创建一个文件总是有一个默认权限的,那么这个权限是怎么来的呢?这就是umask
干的事情。umask
设置了用户创建文件的默认权限,它与chmod
的效果刚好相反,不过umask
设置的权限恰恰相当于是“补码”,因为它是mask,面具,“屏蔽”的意思。比如777
恰好代表屏蔽所有,于是权限就是---------
。
Note:系统不允许你在创建一个文本文件时就赋予它执行权限,必须在创建后用chmod命令增加这一权限。目录则允许设置执行权限,这样针对目录来 说,umask中各个数字最大可以到7。
umask -S
:以u= g= o=
的形式展示权限
如果想知道当前的umask值,可以使用umask命令:
$umask
如果想要改变umask值,只要使用umask命令设置一个新的值即可:
$ umask 002
确认一下系统是否已经接受了新的umask值:
$umask
002
$touch testfile
$ls -l testfile
-rw-rw-r--
3.鸟哥私房菜之第六章2
/var/log/wtmp
是data文件,而不是ASCII文件,只能使用last
命令查看,如果使用cat
会乱码
FHS:Filesystem Hierarchy Standard
:文件系统目录标准
4.鸟哥私房菜之Linux文件和目录管理1
pwd
pwd
:显示当前目录
pwd -P
:显示实际的目录
eg:
/var/root
有两个文件夹,一个是1
,一个是2
。其中1
下有一个软连接2.
指向/var/root/2
# cd /var/root/1/2.
# pwd
/var/root/1/2.
# pwd -P
/var/root/2
mkdir
mkdir -p
:递归地建立目录
mkdir -p ./test1/test2/test3
ls
ls -i
:inode
ls -R
:递归显示。连子目录的文件都显示出来
ls -S
:按照从大到小排序
ls -t
:按照时间从大到小排序
ls -r
:reverse反向,比如ls -rt
就变成了时间从小到大排序
5.鸟哥私房菜之Linux文件和目录管理2
\r
的名字才叫回车
\n
叫换行
vi默认情况下会在打开的文件的末尾添加\n
,vim也是,除非用vim -b
,表示用二进制打开一个文件。
- echo
echo
显示的文本会默认添加\n
,比如:
echo "abcdefg" > haha.txt
haha.txt内容为"abcdefg\n"
如果使用
echo -n "abcdefg" > xixi.txt
则xixi.txt内容为"abcdefg"
,没有换行符。
- od
-A
:文件的offset用多少进制表示,如-Ad
为十进制。-Ao
-Ax
-t
:文件的内容用多少进制表示。
+ -tc
:用ASCII字符或反斜杠序列
+ -d[SIZE]
十进制
+ -o[SIZE]
八进制(系统默认值02)每个整数 SIZE 字节。
+ -u[SIZE]
无符号十进制数每个整数 SIZE 字节。
+ -x[SIZE]
十六进制每个整数 SIZE 字节。
/var/root # echo -n "woailiuguilin" > aiai.txt
/var/root # od -Ad -tc -tx1 aiai.txt
0000000 w o a i l i u g u i l i n
77 6f 61 69 6c 69 75 67 75 69 6c 69 6e
0000013
/var/root # od -Ad -tc -tx2 aiai.txt
0000000 w o a i l i u g u i l i n \0
6f77 6961 696c 6775 6975 696c 006e
0000013
/var/root # od -Ad -tc -tx3 aiai.txt
od: invalid type string 'x3'; 3-byte integral type is not supported
/var/root # od -Ad -tc -tx4 aiai.txt
0000000 w o a i l i u g u i l i n \0 \0 \0
69616f77 6775696c 696c6975 0000006e
0000013
/var/root # od -Ad -tx1 -tc aiai.txt
0000000 77 6f 61 69 6c 69 75 67 75 69 6c 69 6e
w o a i l i u g u i l i n
0000013
/var/root # od -Ad -tc -tx1 -w4 aiai.txt
0000000 w o a i
77 6f 61 69
0000004 l i u g
6c 69 75 67
0000008 u i l i
75 69 6c 69
0000012 n
6e
0000013
/var/root #
-w4
:输出时每行四个字节
Note:注意-t2
的时候涉及到大端小端。
- cat
cat -n
:显示行号
cat -A
:回车显示为$
(Windows的换行回车符显示为^M$
),tab显示为^I
- tac
从最后一行倒着显示
- nl
nl -b a
:a,all。无论是否有空行,都显示行号
nl -b t
:空行不显示行号(可用来统计实际代码行数)
cat hello.c >> hello.c
:会循环将内容复制到hello.c
中
- head
head -n 5
:显示前五行。默认显示前十行
- tail
- od
- more
- less
- hexdump -C
6.鸟哥私房菜之Linux文件和目录管理3
7.鸟哥私房菜之Linux 文件和目录管理4
搜寻档案或目录
which
whereis
locate
find
与文件权限和文件名有关的参数:
find . -name hello.c
限制查找范围仅在当前目录(-maxdepth 1
必须写在其他参数前面):
find . -maxdepth 1 -type f
限制层级(-mindepth
和-maxdepth
不需要区分先后):
find . -mindepth 5 -maxdepth 7 -type f
限制在从当前目录数的第六层:
find . -mindepth 6 -maxdepth 6 -type f
/var/root # ls -al
total 8
drwxr-xr-x 2 root root 100 Aug 26 15:38 .
drwxrwxrwt 4 root root 80 Aug 26 15:38 ..
-rw------- 1 root root 131 Aug 26 15:40 .ash_history
lrwxrwxrwx 1 root root 9 Aug 26 15:38 dos -> /root/dos
-rw-r--r-- 1 root root 242 Aug 26 15:38 hello.c
/var/root # find . -name hello.c
./hello.c
/var/root # find . -type f
./.ash_history
./hello.c
/var/root # find . -type d
.
/var/root # find . -type l
./dos
/var/root # find . -size +0
.
./.ash_history
./dos
./hello.c
-exec
后面接另一条命令,{}
代表所有find到的文件,\;
代表find命令的结束。
/var/root # find . -name hello.c -exec cat {} \;
/* This C source can be compiled with:
tcc -o hello hello.c
or if you have more time:
gcc -o hello hello.c
*/
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argv)
{
printf("Hello World\n");
return 0;
}
8.鸟哥私房菜2nd之Linux磁盘与文件系统管理1
- 磁盘上最小的存储的单位是
扇区(sector)
,通常为512Byte,多个扇区组成块(block)
。
多个盘片的同一位置的磁道(track)
组成了一个柱面(cylinder[ˈsɪlɪndə(r)])
。 - 柱面是分区的最小单位,
分区
就是记录下起始柱面和结束柱面【其实就是记录两个同心圆,同心圆之间的部分就是分出来的区】。这些信息记录在主引导记录(MBR,Master Boot Record)
中,MBR记录磁盘分区表和引导程序
,位于磁盘的第零磁道上,是计算机读取硬盘时最先读取的区域。 - MBR最多提供4个分区的记忆。
- 格式化就是在分区上建立
文件系统(file system)
。 - 为了提高文件的读取效率,引入了
块(block)
, 1Block=2nSector 。因为每次读取一个Sector的话读取的次数太多了,所以每次读一个Block可以减少读取次数,提高效率。但是逻辑块并非越大越好,比如一个块4K,那么存储一个5K大小的内容需要占用两个逻辑块,即文件大小实际为8K。 - 每个文件系统开始位置的块称为
超级块(superblock)
,其的作用是存储文件系统的大小、空的和填满的块,以及其他信息。要使用一个分区来进行数据访问,那么第一个要访问的就是超级块。所以,如果超级块坏了,那磁盘也就基本没救了。 - 超级块占用第1号物理块,是文件系统的控制块;引导块占用第0号物理块,不属于文件系统管辖,如果系统中有多个文件系统,只有根文件系统才有引导程序放在引导块中,其余文件系统都不使用引导块。
ext2
规划出inode
和block area
来分别存储档案的属性(owner/group/rwx/type(f,b,c,s,l,p,d)/ctime创建或状态改变时间[status time]/atime最近一次访问时间[access time]/mtime最近修改时间[modify time]/size/pointer指向该档案的真正内容)
和档案的内容
。
/var/root # ls -l hello.c
-rw-r--r-- 1 root root 242 Aug 27 03:30 hello.c
文件类型/权限 指向数 用户 用户组 大小 mtime最后修改时间 文件名
- ext2创建文件时,至少分配给文件一个inode,和对应于文件大小的block数量。
- ext2创建目录时,给目录一个inode,和至少一个block,inode记录目录属性,block存储
这个目录下的文件的inode和文件名的对应关系
。
eg:读取/etc/vsftpd/vsftpd.conf
- 首先根据
/的inode
找到/的数据区
,在这里面找到etc
名字对应的inode; - 再根据
etc的inode
找到etc的数据区
,在里面找到vsftpd
名字对应的inode; - 再根据
vsftpd的inode
找到vsftpd的数据区
,在里面找到vsftpd.conf
名字对应的inode; - 最后根据
vsftpd.conf的inode
找到vsftpd.conf的数据区
,也就是我们要找的文件。
- 首先根据
- block和inode在格式化的时候就确定了。一个分区能够容纳的文件数和
inode的数量和block的数量(也可以理解为磁盘容量)
有关。block用完了就存不下了,inode用完了也存不下了。 - inode大小为128Byte。
- 这些信息使用
dumpe2fs
查看,如dumpe2fs /dev/sda1
。 - ext2是
非日志式文件系统
。 - 日志式文件系统还要分个
日志块
,专门存储日志。 - 在写入文件内容的同时并没有同时写入文件的
元数据(metadata)
(超级块,inode位图等和文件有关的信息,例如:权限、所有者以及创建和访问时间)。换句话说,Linux先写入文件的内容,然后等到有空的时候才写入文件的metadata。这样若出现写入文件内容之后但在写入文件的meta-data之前系统突然断电,就可能造成在文件系统就会处于不一致的状态。如果是非日志式文件系统,就要扫面全盘,特别慢。但是对于日志式文件系统,只需要查看日志就行了,所以恢复数据的一致性会很快。
9.鸟哥私房菜2nd之Linux磁盘与文件系统管理2
df
显示系统中单签磁盘的总容量、已使用容量、剩余容量。
/var/root # df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/root 56517 56023 494 99% /
tmpfs 7028 8 7020 0% /var
/var/root # df -i
Filesystem Inodes Used Available Use% Mounted on
/dev/root 14592 3263 11329 22% /
tmpfs 1757 6 1751 0% /var
/var/root # df -h
Filesystem Size Used Available Use% Mounted on
/dev/root 55.2M 54.7M 494.0K 99% /
tmpfs 6.9M 8.0K 6.9M 0% /var
du
du -h
:以人类易于理解的方式显示当前文件夹文件及其子文件夹文件大小ln
ln -s
:symbolic link,象征性的链接(s不是soft的意思)fdisk
fdisk -l
:显示所有分区
fdisk /dev/sda
:对/dev/sda
进行重新分区
partprobe
:分区之后想建立文件系统,如果需要重启才能检测到新分的区,那么直接使用partprobe
可以起到相同的效果
Arch
fstab
文件/etc/fstab
包含了静态文件系统信息,定义了存储设备和分区整合到整个系统的方式。mount
命令会读取这个文件,确定设备和分区的挂载选项。
[root@pArch ~]# cat /etc/fstab
#
# /etc/fstab: static file system information
#
# <file system> <dir> <type> <options> <dump> <pass>
# /dev/sda1
UUID=1eb59cbf-bbd5-467e-adb0-77a4e149d2f4 / ext4 rw,relatime,data=ordered 0 1
# /dev/sda2
UUID=947926e6-7063-4a20-b188-91315789f867 none swap defaults 0 0
/dev/sda2 /home ext4 nodev,nosuid 0 2
在<file system>
使用LABEL=
,或UUID=
,或名称/dev/sda2
。
- <file systems>
- 要挂载的分区或存储设备。如/dev/sda2
- <dir> - <file systems>
的挂载位置。如/home
- <type>
- 要挂载设备或是分区的文件系统类型。设置成auto类型,mount 命令会猜测使用的文件系统类型,对 CDROM 和 DVD 等移动设备是非常有用的。
- <options>
- 挂载时使用的参数。
文件系统标识
在 /etc/fstab
配置文件中你可以以三种不同的方法表示文件系统:内核名称
、UUID
或者 label
。使用 UUID 或是 label 的好处在于它们与磁盘顺序无关。如果你在 BIOS 中改变了你的存储设备顺序,或是重新拔插了存储设备,或是因为一些 BIOS 可能会随机地改变存储设备的顺序,那么用 UUID 或是 label 来表示将更有效。
要显示分区的基本信息请运行:
[root@pArch ~]# lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
fd0
sda
├─sda1 ext4 1eb59cbf-bbd5-467e-adb0-77a4e149d2f4 /
└─sda2 ext4 7a6126d0-585a-4c4a-aeb9-3bbd7dc107ac /home
sr0(名称) iso9660(文件系统类型) ARCH_201508(label) 2015-08-01-07-07-00-00(UUID) /run/media/lgl(挂载点)
或者是:
[root@pArch ~]# blkid /dev/sda2
/dev/sda2: UUID="7a6126d0-585a-4c4a-aeb9-3bbd7dc107ac" TYPE="ext4" PARTUUID="33ee702e-02"
UUID
所有分区和设备都有唯一的 UUID。它们由文件系统生成工具 (mkfs.*) 在创建文件系统时生成。【这就意味着,同一块儿设备,在被重新格式化文件系统之后,UUID就变了。】
A start job is running for dev-disk-by\x2dlabel-swapspace.device
I think the only problem is the change of UUID of your disks/swapfile.
My situation is: I use genfstab -U -p /mnt >> /mnt/etc/fstab
to generate a raw fstab file. My /dev/sda2 was used as swap at that time. Then after installing the OS, I delete and reformat my /dev/sda2, and put my /home directory on it.(Don’t ask me why, just for fun. Knowledge comes from ZheTeng. =.= )I add new info about my /home to the fstab file. Then the problem occurs.
The key point is that after reformatting my /dev/sda2 disk, its UUID changed. However, the fstab file still use its former UUID, which caused the problem.
Way to do: use lsblk -f
to view the new UUID and modify them to be correct ones in the fstab file.
Bingo!O(∩_∩)O~~
10.鸟哥私房菜2nd之Linux磁盘与文件系统管理3
sync
将暂存在内存中的数据回写入磁盘,关机或重启之前使用,是个好习惯。
# sync;sync;reboot
dd
dd if=/dev/zero of=/tmp/swap1 bs=1M count=100
或dd < /dev/zero > /tmp/swap2 bs=1M count=100
:bs是block size,count是block的数量。然后使用swapon /tmp/swap1
或swapoff /tmp/swap1
就可以对swap分区进行挂载或卸载了
当然还有一种方法是用fdisk
分出一块儿磁盘比如/dev/sda2
,然后mkswap /dev/sda2
将其变成swap分区,再使用swapon/swapoff
11.鸟哥私房菜2nd之文件的压缩与打包
对于压缩文件,一般我们按照压缩工具对压缩包起名字,如zip
对应.zip
,tar
对应.tar
,gzip
对应.gz
。
- tar
-f
:之后必须立即接文件名(要生成的压缩包的文件名),比如tar -zcvf xxx
而不能是tar -zcfv xxx
(这是错误的写法)
--exclude FILE
:不打包FILE文件
-c
:compress,压缩
-v
:压缩过程中显示文件
-x
:解压
注意:如果仅仅是-cvf
的话是只打包,不压缩
-z
:兼有gzip
的属性
-t
:查看压缩包里的文件
- zip
-r
:那次OO作业坑死我了,zip
不会默认递归压缩
-d
:从压缩包中删除指定文件
-m
:把文件移动到压缩文件中。如zip test.zip -m a.out
就把a.out加入test.zip了,同时a.out没了。
压缩完后可以用zipinfo -l xxx
查看压缩包包含文件。
-P
:含密码压缩。如zip -r -P 123456 test.zip test
。unzip test.zip -P 123456
。当然也可以直接unzip test.zip
,然后再根据提示输入密码。
- unzip
-l
:查看压缩包包含文件
-P
:输入解压密码
12.鸟哥私房菜2nd之Vi文字处理器1
vi
三种模式:一般模式,编辑模式,指令模式
一般模式 -> 编辑模式:i
(insert)在光标前输入,I
则代表在行首;a
(add)在光标后输入,A
则代表在行尾;o
新插入下一行,O
新插入上一行;r
(replace)取代一次,R
一直取代,直到按下ESC(escape),进入一般模式。s
删除光标所在字符,并进入编辑模式(相当于x
+i
);S
删除所在行,并进入编辑模式(相当于dd
+O
)。
h/j/k/l:left/down/up/right
0
:光标移动到行首。
$
:光标移动到行尾。
G
:移动到最后一行。
nG
:移动到第n行。
gg
:移动到行首,相当于1G
。
n<Enter>
:光标下移n行。
n<space>
:光标后移n个字符。
复制粘贴
yy
:复制光标所在行。
nyy
:复制光标所在的向下n行。1yy
相当于yy
p
:粘贴到光标下一行
P
:粘贴到光标上一行
撤销
u
:撤销,相当于Ctrl+z
:e!
:恢复最初始状态
查找
/word
、?word
、n
、N
删除
x
:向后删除,相当于Del
。nx
向后删除n个
X
:向前删除,相当于Backspace
。nX
向前删除n个
dd
:删除整行。ndd
删除光标所在的向下n行
dG
:删除从光标所在行到末尾
d1G
:删除从光标所在行到行首
翻页
Ctrl+b
:向上翻页
Ctrl+f
:向下翻页
编辑模式 -> 一般模式:Esc。
13.鸟哥私房菜2nd之Vi文字处理器2
vi
替换
相当于Windows的Ctrl+h
:n1,n2s/word1/word2/g
:g(global)从第n1行到第n2行用word2替换所有的word1
eg:
:1,$s/lgl/lhb/g
:全文替换从第一行到最后一行,用lhb替代lgl,相当于:%s/lgl/lhb/g
:1,$s/lgl/lhb/gc
:c(confirm),替换前确认
保存
:w
:保存
:w!
:对于只读的文档,强制保存
:w FILENAME
:另存为
:n1,n2 w FILENAME
:将n1到n2的内容保存到FILENAME
退出和保存退出
:q
:离开vi
:q!
:强制离开而不保存
:wq
:存储后离开,相当于:x
:wq!
:强制存储后离开
其他指令
:r FILENAME
:添加另一个文档的数据,到游标所在行的下一行
:set nu
:显示行号
:set nonu
:取消行号
Visual block
v
:字符选择,相当于按着shift选择
V
:行选择
Ctrl+v
:块选择
y
:复制反白的地方
d
:删除反白的地方
多文件编辑
:n
:编辑下一个文件
:N
:编辑上一个文件
:files
:列出当前vim打开的所有文件
多窗口功能
:sp FILENAME
:新窗口打开FILENAME,否则打开本文件
Ctrl+w
:之后按k/j
上下切换窗口
14.林夕昱作品鸟哥私房菜之认识bashshel 1
env
set
都可以查看环境变量,其中env
是environment的缩写。
15.林夕昱作品鸟哥私房菜之认识bashshel 2
export
将用户自定义的变量变成系统变量。
原理:export就相当于把一个变量从一个文件导出导出,这样的话这个变量就相当于是“全局”的了,于是大家都可以用了!
启动shell的时候,系统会专门分配一块儿内存用于存储环境变量。export
就把自定义变量移动到了那里。
子shell会继承父shell的环境变量。- 扩增环境变量
eg:PATH="$PATH":/home
unset xxx
:取消变量,变量名前不用加$符号
16.林夕昱作品鸟哥私房菜之认识bashshel 3
alias
查看别名
设置别名:alias lm='ls -al | more'
,注意等号后面是引号'
,而不是撇号。unalias
撤销别名,eg:unalias lm
- bash设置
bash shell的系统设定值:/etc/profile
和/etc/bashrc
个人设定值:~/.bash_profile
和~/.bashrc
/etc/profile
:设定了几个重要的环境变量,如PATH/USER/MAIL/LOGNAME/HOSTNAME/HISTSIZE/INPUTRC
等。
/etc/bashrc
:规划了umask
值,和提示字符PS1
的内容。
~/.bash_profile
:定义了个人化的PATH和环境变量的文件名称。
~/.bashrc
:设定了个人化变量,比如命令别名,路径的重定义。
17.林夕昱作品鸟哥私房菜之认识bashshel 4
- shell下按键组合
Ctrl+C
Ctrl+D
Ctrl+Z
Ctrl+M
:相当于按下Enter
Ctrl+U
:删除整行命令
18.林夕昱作品鸟哥私房菜之认识bashshel 5
stdin
:代号为0
,符号表示为<
或<<
;
stdout
:代号为1
,符号表示为1>
或>>
,其中1>
可以省略为>
;
stderr
:代号为2
,符号表示为2>
或2>>
,其中2>
不能省略。
eg:
当find命令遇到错误时,结果并不会重定向到文件中:
[lgl@pFedora ~]$ find /root -name txt > err.txt
find: ‘/root’: Permission denied
想分开重定向正确和错误信息,可以使用:
find /root -name txt > right.txt 2> err.txt
如果想把正确和错误信息同时放入一个文件:
find /root -name txt 1> right.txt 2> right.txt
但是上面的命令效果并不好,最好用这个:
find /root -name txt > right.txt 2>&1
tee
双向重定向:将数据流同时输出到屏幕和文件。
如果以累加的方式输入到文件,用-a
相当于重定向中的>>
。
[lgl@pFedora ~]$ ls -l | tee haha
total 4608
-rw-------. 1 lgl lgl 5738496 Aug 31 13:33 core.1938
drwxr-xr-x. 2 lgl lgl 4096 Aug 31 13:10 Desktop
drwxr-xr-x. 3 lgl lgl 4096 Aug 31 13:41 Documents
drwxr-xr-x. 2 lgl lgl 4096 Aug 31 13:10 Downloads
drwxr-xr-x. 2 lgl lgl 4096 Aug 31 13:10 Music
drwxr-xr-x. 2 lgl lgl 4096 Aug 31 13:10 Pictures
drwxr-xr-x. 2 lgl lgl 4096 Aug 31 13:10 Public
drwxr-xr-x. 2 lgl lgl 4096 Aug 31 13:10 Templates
drwxr-xr-x. 2 lgl lgl 4096 Aug 31 13:10 Videos
[lgl@pFedora ~]$ cat haha
total 4608
-rw-------. 1 lgl lgl 5738496 Aug 31 13:33 core.1938
drwxr-xr-x. 2 lgl lgl 4096 Aug 31 13:10 Desktop
drwxr-xr-x. 3 lgl lgl 4096 Aug 31 13:41 Documents
drwxr-xr-x. 2 lgl lgl 4096 Aug 31 13:10 Downloads
drwxr-xr-x. 2 lgl lgl 4096 Aug 31 13:10 Music
drwxr-xr-x. 2 lgl lgl 4096 Aug 31 13:10 Pictures
drwxr-xr-x. 2 lgl lgl 4096 Aug 31 13:10 Public
drwxr-xr-x. 2 lgl lgl 4096 Aug 31 13:10 Templates
drwxr-xr-x. 2 lgl lgl 4096 Aug 31 13:10 Videos
- 命令执行
command1;command2
:分别执行两条命令
command1 && command2
:只有command1
正确才会执行command2
,否则不执行!
command1 || command2
:如果command1
出错才执行command2
,否则不执行!
所以可以这样:
[lgl@pFedora ~]$ ls
core.1938 Documents haha Pictures Templates
Desktop Downloads Music Public Videos
[lgl@pFedora ~]$ ls -l liuhaibo && echo "file liuhaibo exist" || echo "file liuhaibo doesn't exist"
ls: cannot access liuhaibo: No such file or directory
file liuhaibo doesn't exist
[lgl@pFedora ~]$ ls -l haha && echo "file haha exist" || echo "file haha doesn't exist"
-rw-rw-r--. 1 lgl lgl 475 Sep 1 07:48 haha
file haha exist
19.林夕昱作品鸟哥私房菜之认识bashshel 6
cut
块选择,而grep
是行选择。
-d
:自定义分割字段
-f
:跟-d
一起使用,指定显示的区域
lgl@pArch ~ $ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl
lgl@pArch ~ $ echo $PATH | cut -d ':' -f 2
/usr/local/bin
lgl@pArch ~ $ echo $PATH | cut -d ':' -f -1
/usr/local/sbin
lgl@pArch ~ $ echo $PATH | cut -d ':' -f 2,4
/usr/local/bin:/usr/bin/site_perl
lgl@pArch ~ $ echo $PATH | cut -d ':' -f 2-4
/usr/local/bin:/usr/bin:/usr/bin/site_perl
-c
:字符范围选择
lgl@pArch ~ $ export
DBUS_SESSION_BUS_ADDRESS='unix:abstract=/tmp/dbus-QLnpqvGVBA,guid=d3d7079905960a39bee5682155e71a52'
DESKTOP_SESSION=gnome
DISPLAY=:0
GDMSESSION=gnome
GDM_LANG=en_US.UTF-8
GJS_DEBUG_OUTPUT=stderr
GJS_DEBUG_TOPICS='JS ERROR;JS LOG'
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
HOME=/home/lgl
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LESS=-R
LOGNAME=lgl
LSCOLORS=Gxfxcxdxbxegedabagacad
MAIL=/var/spool/mail/lgl
PAGER=less
PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl
PWD=/home/lgl
SESSION_MANAGER=local/pArch:@/tmp/.ICE-unix/534,unix/pArch:/tmp/.ICE-unix/534
SHELL=/usr/bin/zsh
SHLVL=1
TERM=xterm-256color
USER=lgl
VTE_VERSION=4002
WINDOWID=16777222
WINDOWPATH=2
XAUTHORITY=/run/user/1000/gdm/Xauthority
XDG_CURRENT_DESKTOP=GNOME
XDG_MENU_PREFIX=gnome-
XDG_RUNTIME_DIR=/run/user/1000
XDG_SEAT=seat0
XDG_SESSION_DESKTOP=gnome
XDG_SESSION_ID=c3
XDG_SESSION_TYPE=x11
XDG_VTNR=2
ZSH=/home/lgl/.oh-my-zsh
lgl@pArch ~ $ export | cut -c 2-3
BU
ES
IS
DM
DM
JS
JS
NO
OM
AN
C_
ES
OG
SC
AI
AG
AT
WD
ES
HE
HL
ER
SE
TE
IN
IN
AU
DG
DG
DG
DG
DG
DG
DG
DG
SH
当然,也可以用:
export | cut -c 1,3
只选择每行的第一和第三个字符。
Note:如果是多个连续空格,cut
能力有限,就跪了……
- grep
cat /etc/passwd | grep lgl
相当于
grep lgl < /etc/passwd
而不是
grep lgl < cat /etc/passwd
(错误写法),返回的信息是:no such file or directory: cat
如果使用
lgl@pArch ~ $ grep lgl < `cat /etc/passwd`
zsh: no such file or directory: root:x:0:0:root:/root:bin/bash
说明< cat /etc/passwd
只能将/etc/passwd
文件的第一行重定向给grep
。
-n
:显示行号。在输出筛选出来的行的时候,顺便加上行号
-c
:统计出现次数
eg:
lgl@pArch ~ $ last | grep -c lgl
15
说明lgl出现了15次。
-i
:筛选时忽略大小写
- sort
-t
:后跟自定义分隔符
-k
:选取被分隔出来的哪一段
-n
:使用纯数字排序,默认是文字类型,也就是说默认情况下100会排在11前面。
-r
:反向排序
-u
:相同数据只显示一次
lgl@pArch ~ $ sort -t ':' -k 3 < /etc/passwd(按照第三个字段UID默认排序,相当于cat /etc/passwd | sort -t ':' -k 3)
root:x:0:0:root:/root:/bin/bash
lgl:x:1000:100::/home/lgl:/usr/bin/zsh
polkitd:x:102:102:Policy Kit Daemon:/:/usr/bin/nologin
bin:x:1:1:bin:/bin:/usr/bin/nologin
gdm:x:120:120:Gnome Display Manager:/var/lib/gdm:/sbin/nologin
colord:x:124:124::/var/lib/colord:/bin/false
rtkit:x:133:133:RealtimeKit:/proc:/bin/false
ftp:x:14:11:ftp:/srv/ftp:/usr/bin/nologin
systemd-journal-gateway:x:191:191:systemd-journal-gateway:/:/usr/bin/nologin
systemd-timesync:x:192:192:systemd-timesync:/:/usr/bin/nologin
systemd-network:x:193:193:systemd-network:/:/usr/bin/nologin
systemd-bus-proxy:x:194:194:systemd-bus-proxy:/:/usr/bin/nologin
systemd-resolve:x:195:195:systemd-resolve:/:/usr/bin/nologin
daemon:x:2:2:daemon:/:/usr/bin/nologin
http:x:33:33:http:/srv/http:/usr/bin/nologin
uuidd:x:68:68:uuidd:/:/usr/bin/nologin
mail:x:8:12:mail:/var/spool/mail:/usr/bin/nologin
dbus:x:81:81:dbus:/:/usr/bin/nologin
avahi:x:84:84:avahi:/:/bin/nologin
git:x:997:997:git daemon user:/:/bin/bash
systemd-journal-upload:x:998:998:systemd Journal Upload:/:/sbin/nologin
systemd-journal-remote:x:999:999:systemd Journal Remote:/:/sbin/nologin
nobody:x:99:99:nobody:/:/usr/bin/nologin
lgl@pArch ~ $ cat /etc/passwd | sort(首字段默认排序)
avahi:x:84:84:avahi:/:/bin/nologin
bin:x:1:1:bin:/bin:/usr/bin/nologin
colord:x:124:124::/var/lib/colord:/bin/false
daemon:x:2:2:daemon:/:/usr/bin/nologin
dbus:x:81:81:dbus:/:/usr/bin/nologin
ftp:x:14:11:ftp:/srv/ftp:/usr/bin/nologin
gdm:x:120:120:Gnome Display Manager:/var/lib/gdm:/sbin/nologin
git:x:997:997:git daemon user:/:/bin/bash
http:x:33:33:http:/srv/http:/usr/bin/nologin
lgl:x:1000:100::/home/lgl:/usr/bin/zsh
mail:x:8:12:mail:/var/spool/mail:/usr/bin/nologin
nobody:x:99:99:nobody:/:/usr/bin/nologin
polkitd:x:102:102:Policy Kit Daemon:/:/usr/bin/nologin
root:x:0:0:root:/root:/bin/bash
rtkit:x:133:133:RealtimeKit:/proc:/bin/false
systemd-bus-proxy:x:194:194:systemd-bus-proxy:/:/usr/bin/nologin
systemd-journal-gateway:x:191:191:systemd-journal-gateway:/:/usr/bin/nologin
systemd-journal-remote:x:999:999:systemd Journal Remote:/:/sbin/nologin
systemd-journal-upload:x:998:998:systemd Journal Upload:/:/sbin/nologin
systemd-network:x:193:193:systemd-network:/:/usr/bin/nologin
systemd-resolve:x:195:195:systemd-resolve:/:/usr/bin/nologin
systemd-timesync:x:192:192:systemd-timesync:/:/usr/bin/nologin
uuidd:x:68:68:uuidd:/:/usr/bin/nologin
lgl@pArch ~ $ cat /etc/passwd | sort -t ':' -k 3 -n(纯数字排序)
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/usr/bin/nologin
daemon:x:2:2:daemon:/:/usr/bin/nologin
mail:x:8:12:mail:/var/spool/mail:/usr/bin/nologin
ftp:x:14:11:ftp:/srv/ftp:/usr/bin/nologin
http:x:33:33:http:/srv/http:/usr/bin/nologin
uuidd:x:68:68:uuidd:/:/usr/bin/nologin
dbus:x:81:81:dbus:/:/usr/bin/nologin
avahi:x:84:84:avahi:/:/bin/nologin
nobody:x:99:99:nobody:/:/usr/bin/nologin
polkitd:x:102:102:Policy Kit Daemon:/:/usr/bin/nologin
gdm:x:120:120:Gnome Display Manager:/var/lib/gdm:/sbin/nologin
colord:x:124:124::/var/lib/colord:/bin/false
rtkit:x:133:133:RealtimeKit:/proc:/bin/false
systemd-journal-gateway:x:191:191:systemd-journal-gateway:/:/usr/bin/nologin
systemd-timesync:x:192:192:systemd-timesync:/:/usr/bin/nologin
systemd-network:x:193:193:systemd-network:/:/usr/bin/nologin
systemd-bus-proxy:x:194:194:systemd-bus-proxy:/:/usr/bin/nologin
systemd-resolve:x:195:195:systemd-resolve:/:/usr/bin/nologin
git:x:997:997:git daemon user:/:/bin/bash
systemd-journal-upload:x:998:998:systemd Journal Upload:/:/sbin/nologin
systemd-journal-remote:x:999:999:systemd Journal Remote:/:/sbin/nologin
lgl:x:1000:100::/home/lgl:/usr/bin/zsh
lgl@pArch ~ $ cat /etc/passwd | sort -t ':' -k 3 -nr(纯数字逆序排序)
lgl:x:1000:100::/home/lgl:/usr/bin/zsh
systemd-journal-remote:x:999:999:systemd Journal Remote:/:/sbin/nologin
systemd-journal-upload:x:998:998:systemd Journal Upload:/:/sbin/nologin
git:x:997:997:git daemon user:/:/bin/bash
systemd-resolve:x:195:195:systemd-resolve:/:/usr/bin/nologin
systemd-bus-proxy:x:194:194:systemd-bus-proxy:/:/usr/bin/nologin
systemd-network:x:193:193:systemd-network:/:/usr/bin/nologin
systemd-timesync:x:192:192:systemd-timesync:/:/usr/bin/nologin
systemd-journal-gateway:x:191:191:systemd-journal-gateway:/:/usr/bin/nologin
rtkit:x:133:133:RealtimeKit:/proc:/bin/false
colord:x:124:124::/var/lib/colord:/bin/false
gdm:x:120:120:Gnome Display Manager:/var/lib/gdm:/sbin/nologin
polkitd:x:102:102:Policy Kit Daemon:/:/usr/bin/nologin
nobody:x:99:99:nobody:/:/usr/bin/nologin
avahi:x:84:84:avahi:/:/bin/nologin
dbus:x:81:81:dbus:/:/usr/bin/nologin
uuidd:x:68:68:uuidd:/:/usr/bin/nologin
http:x:33:33:http:/srv/http:/usr/bin/nologin
ftp:x:14:11:ftp:/srv/ftp:/usr/bin/nologin
mail:x:8:12:mail:/var/spool/mail:/usr/bin/nologin
daemon:x:2:2:daemon:/:/usr/bin/nologin
bin:x:1:1:bin:/bin:/usr/bin/nologin
root:x:0:0:root:/root:/bin/bash
lgl@pArch ~ $ last | cut -d ' ' -f 1 | sort (获取第一字段,排序)
lgl
lgl
lgl
lgl
lgl
lgl
lgl
lgl
lgl
lgl
lgl
lgl
lgl
lgl
lgl
reboot
reboot
reboot
reboot
reboot
reboot
root
root
root
root
root
wtmp
lgl@pArch ~ $ last | cut -d ' ' -f 1 | sort -u(获取第一字段,排序,且重复的只显示一次)
lgl
reboot
root
wtmp
uniq
unique
-i
:忽略大小写
-c
:进行计数
这是last
的第一字段内容:
lgl@pArch ~ $ last | cut -d ' ' -f 1
lgl
lgl
reboot
reboot
lgl
lgl
lgl
lgl
lgl
reboot
lgl
lgl
lgl
lgl
reboot
lgl
reboot
lgl
lgl
lgl
root
root
root
root
root
reboot
wtmp
使用uniq
:
lgl@pArch ~ $ last | cut -d ' ' -f 1 | uniq
lgl
reboot
lgl
reboot
lgl
reboot
lgl
reboot
lgl
root
reboot
wtmp
使用uniq -c
:
lgl@pArch ~ $ last | cut -d ' ' -f 1 | uniq -c
2 lgl
2 reboot
5 lgl
1 reboot
4 lgl
1 reboot
1 lgl
1 reboot
3 lgl
5 root
1 reboot
1
1 wtmp
加上sort
:
lgl@pArch ~ $ last | cut -d ' ' -f 1 | sort
lgl
lgl
lgl
lgl
lgl
lgl
lgl
lgl
lgl
lgl
lgl
lgl
lgl
lgl
lgl
reboot
reboot
reboot
reboot
reboot
reboot
root
root
root
root
root
wtmp
lgl@pArch ~ $ last | cut -d ' ' -f 1 | sort | uniq
lgl
reboot
root
wtmp
lgl@pArch ~ $ last | cut -d ' ' -f 1 | sort | uniq -c
1
15 lgl
6 reboot
5 root
1 wtmp
wc
-l
:line,行数
-w
:word,字数
-m
:字符数
lgl@pArch ~ $ wc test.txt
3 6 29 test
三行,六个字(word,单词),29个字符
注:想查看所有的字符,使用cat -A test.txt
。
- ‘tr’
-d
:delete,删除
-r
:replace,替换
lgl@pArch ~ $ echo "abcde" > test.txt
lgl@pArch ~ $ cat test.txt | tr -d 'c'
abde
lgl@pArch ~ $ cat test.txt | tr -s 'b' 'x'
axcde
lgl@pArch ~ $ cat test.txt | tr -s '[a-z]' '[A-Z]'
ABCDE
dos2unix
20.林夕昱作品鸟哥私房菜之认识bashshel 7
col
-x
:将tab转换为空格expand
-t n
:将tab转换成n个空格,不加-t
默认是8个
区别:expand是彻底的替换,而col -x
如果碰到tab后面就是换行符\n
(即tab键在行尾),则直接删除tab。join
默认情况下以空格分隔字段,并将两个文件按照第一字段(如果相同)连接成一行(此时被比对的字段进行合并,且提到行首)。
-t
:后接自定义分隔符
-i
:比对的时候忽略大小写
-1 n
:第一个文档用第n个字段参与比对
-2 n
:第二个文档用第n个字段参与比对
lgl@pArch /tmp $ tail -n 4 /etc/group > group
lgl@pArch /tmp $ tail -n 4 /etc/shadow > shadow
tail: cannot open ‘/etc/shadow’ for reading: Permission denied
lgl@pArch /tmp $ sudo !!
lgl@pArch /tmp $ sudo tail -n 4 /etc/shadow > shadow
[sudo] password for lgl:
lgl@pArch /tmp $ cat -n passwd;cat -n group;cat -n shadow
1 colord:x:124:124::/var/lib/colord:/bin/false
2 rtkit:x:133:133:RealtimeKit:/proc:/bin/false
3 gdm:x:120:120:Gnome Display Manager:/var/lib/gdm:/sbin/nologin
4 git:x:997:997:git daemon user:/:/bin/bash
1 colord:x:124:
2 rtkit:x:133:
3 gdm:x:120:
4 git:x:997:
1 colord:!:16680:0:99999:7:::
2 rtkit:!:16680:0:99999:7:::
3 gdm:!:16680:0:99999:7:::
4 git:!:16680::::::
(将passwd和group按照第一字段比照,相同则合并)
lgl@pArch /tmp $ join -t ':' passwd group | cat -n
1 colord:x:124:124::/var/lib/colord:/bin/false:x:124:
2 rtkit:x:133:133:RealtimeKit:/proc:/bin/false:x:133:
3 gdm:x:120:120:Gnome Display
Manager:/var/lib/gdm:/sbin/nologin:x:120:
4 git:x:997:997:git daemon user:/:/bin/bash:x:997:
lgl@pArch /tmp $ join -t ':' group shadow | cat -n
1 colord:x:124::!:16680:0:99999:7:::
2 rtkit:x:133::!:16680:0:99999:7:::
3 gdm:x:120::!:16680:0:99999:7:::
4 git:x:997::!:16680::::::
(将passwd的第四字段和group的第三字段比照,相同则合并)
lgl@pArch /tmp $ join -t ':' -1 4 passwd -2 3 group | cat -n
1 124:colord:x:124::/var/lib/colord:/bin/false:colord:x:
2 133:rtkit:x:133:RealtimeKit:/proc:/bin/false:rtkit:x:
3 120:gdm:x:120:Gnome Display
Manager:/var/lib/gdm:/sbin/nologin:gdm:x:
4 997:git:x:997:git daemon user:/:/bin/bash:git:x:
这里再复习一下tr
:
(以下两个命令等价)
lgl@pArch /tmp $ tr -s ':' '=' < passwd > passwd2
lgl@pArch /tmp $ cat passwd | tr -s ':' '=' > passwd2
(只能单个字符替换为单个字符,以下命令只能将':'替换为'=',而非'=.=')
lgl@pArch /tmp $ tr -s ':' '=.=' < passwd
colord=x=124=124=/var/lib/colord=/bin/false
rtkit=x=133=133=RealtimeKit=/proc=/bin/false
gdm=x=120=120=Gnome Display Manager=/var/lib/gdm=/sbin/nologin
git=x=997=997=git daemon user=/=/bin/bash
(不信的话,咱看看内容)
lgl@pArch /tmp $ cat passwd2
colord=x=124=124=/var/lib/colord=/bin/false
rtkit=x=133=133=RealtimeKit=/proc=/bin/false
gdm=x=120=120=Gnome Display Manager=/var/lib/gdm=/sbin/nologin
git=x=997=997=git daemon user=/=/bin/bash
Ctrl+L
:相当于clear
,清屏paste
和join
类似。
-d
:delimiter,定界符
eg:
paste -d ':' passwd group
区别:paste
以第一字段比照,且不合并所比照的字段split
split [参数] [文件] [前缀prefix]
-b n
:Byte,以n字节为一个文件对目标文件进行分割
-k n
:Kb
-m n
:Mb
-l n
:以n行为一个文件对目标文件进行分割
lgl@pArch /tmp $ ls -l join.txt
-rw-r--r-- 1 lgl users 2346 Sep 4 02:00 join.txt
lgl@pArch /tmp $ split -b 256 join.txt haha_
lgl@pArch /tmp $ ls -l hah*
-rw-r--r-- 1 lgl users 256 Sep 4 02:25 haha_aa
-rw-r--r-- 1 lgl users 256 Sep 4 02:25 haha_ab
-rw-r--r-- 1 lgl users 256 Sep 4 02:25 haha_ac
-rw-r--r-- 1 lgl users 256 Sep 4 02:25 haha_ad
-rw-r--r-- 1 lgl users 256 Sep 4 02:25 haha_ae
-rw-r--r-- 1 lgl users 256 Sep 4 02:25 haha_af
-rw-r--r-- 1 lgl users 256 Sep 4 02:25 haha_ag
-rw-r--r-- 1 lgl users 256 Sep 4 02:25 haha_ah
-rw-r--r-- 1 lgl users 256 Sep 4 02:25 haha_ai
-rw-r--r-- 1 lgl users 42 Sep 4 02:25 haha_aj
lgl@pArch /tmp $ cat -n haha_aa
1 lgl@pArch /tmp $ tail -n 4 /etc/group > group
2 lgl@pArch /tmp $ tail -n 4 /etc/shadow > shadow
3 tail: cannot open ‘/etc/shadow’ for reading: Permission denied
4 lgl@pArch /tmp $ sudo !!
5 lgl@pArch /tmp $ sudo tail -n 4 /etc/shadow > shadow
6 [sudo] password%
(可以看到haha_aa的最后连结束符换行符\n都没有)
将文件切分成多行:
split -l 3 join.txt hehe_
会以3行生成一个以hehe_开头的文件。
再将文件合并:
cat hehe_* > total.txt
同理也可以将按自己分的文件合并:
cat haha* > total.txt
xargs
xarguments,参数代换。
-e string
:eof,后接字符串,当分析到这个字符串就停止
-p
:执行前先询问
-n n
:后接数字,当转换过来一大波参数时,一次传给命令n个
如果xargs
后面不加任何命令,相当于echo
,只不过输出的时候换行和空白均被空格取代。file -Lz * | grep ASCII | cut -d ":" -f1 | xargs ls -l
第一个,
file -Lz *
,用于查找是符号链接或经过压缩的文件。他将输出传递给下一个命令grep ASCII
,该命令在其中搜索类型是 “ASCII” 的,产生如下所示的输出:
alert_DBA102.log: ASCII English text
alert_DBA102.log.Z: ASCII text (compress’d data 16 bits)
dba102_asmb_12307.trc.Z: ASCII English text (compress’d data 16 bits)
dba102_asmb_20653.trc.Z: ASCII English text (compress’d data 16 bits)
由于我们只对文件名感兴趣,因此我们应用下一个命令 cut -d ":" -f1
,仅显示第一个字段:
alert_DBA102.log
alert_DBA102.log.Z
dba102_asmb_12307.trc.Z
dba102_asmb_20653.trc.Z
目前,我们希望使用 ls -l
命令,将上述列表作为参数进行传递,一次传递一个。xargs 命令允许你这样做。最后一部分,xargs ls -l
,用于接收输出并对其执行 ls -l
命令。
如果想碰到alert_DBA102.log.Z
就结束,则使用:
file -Lz * | grep ASCII | cut -d ":" -f1 | xargs -e "alert_DBA102.log.Z" ls -l
如果想一次只显示两个,不想直接输出所有的结果,可以使用:
file -Lz * | grep ASCII | cut -d ":" -f1 | xargs -n 2 ls -l
如果想每次执行ls -l
之前都先询问一下,加上-p
:
file -Lz * | grep ASCII | cut -d ":" -f1 | xargs -p ls -l
统计所有文本文件的字符数:
file * | grep ASCII | cut -d ":" -f1 | xargs wc
21林夕昱作品:鸟哥私房菜之正则表达式1
[]
:范围选择。如果想搜寻英文的句号,只需要grep [.] hello.txt
就好了,其中.
不需要转义,因为在[]
里面。
使用grep "go\{2,\}" hello.txt
搜寻两个以上的o的时候,会匹配到gooooogle,因为5个o显然包含两个o。
shell中的*
代表任意字符
0~多个,而正则表达式中的*
只代表前一个字符
出现0~多次。意义不同。
- $$
$
在shell中表示当前shell的pid。第一个$
表示取变量的值,和echo $PATH
中的$
意义相同。
lgl@pArch ~ $ echo $$
2360
(进入另一个Bshell)
lgl@pArch ~ $ bash
[lgl@pArch ~]$ echo $$
2391
(进入另一个Bshell)
[lgl@pArch ~]$ bash
[lgl@pArch ~]$ echo $$
2394
(进入另一个Bshell)
[lgl@pArch ~]$ bash
[lgl@pArch ~]$ echo $$
2395
(进入另一个Bshell)
[lgl@pArch ~]$ bash
[lgl@pArch ~]$ echo $$
2396
(进入另一个Zshell)
[lgl@pArch ~]$ zsh
lgl@pArch ~ $ echo $$
2397
(退出当前的Zshell)
lgl@pArch ~ $ exit
[lgl@pArch ~]$ echo $$
2396
[lgl@pArch ~]$ exit
exit
[lgl@pArch ~]$ echo $$
2395
[lgl@pArch ~]$ exit
exit
[lgl@pArch ~]$ echo $$
2394
[lgl@pArch ~]$ exit
exit
[lgl@pArch ~]$ echo $$
2391
[lgl@pArch ~]$ exit
exit
lgl@pArch ~ $ echo $$
2360
22.林夕昱作品:鸟哥私房菜之正则表达式2
sed
-n
∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-i
∶直接修改读取的档案内容,而不是由萤幕输出。默认情况下,添加行只在屏幕上显示,并不真正修改文件。
常用命令:
注意这些模式都必须用单引号!!!!!!!
a
新增,所以在当前行的下面,和vi的意思差不多;c
:行取代;d
∶删除;i
:插入,在当前行的上面,也和vi的意思差不多;p
∶输出到屏幕;s
:取代,例如 1,20s/old/new/g。
(假设我们有一文件名为ab)
删除某行(并不修改文件内容,除非有-i
参数)
[root@localhost ruby] # sed '1d' ab #删除第一行
[root@localhost ruby] # sed '$d' ab #删除最后一行
[root@localhost ruby] # sed '1,2d' ab #删除第一行到第二行
显示某行
[root@localhost ruby] # sed -n '1p' ab #显示第一行
[root@localhost ruby] # sed -n '$p' ab #显示最后一行
[root@localhost ruby] # sed -n '1,2p' ab #显示第一行到第二行
使用模式进行查询(
//
中间的内容是正则表达式,所以当查询$
、.
等字符的时候要转义!!!)
[root@localhost ruby] # sed -n '/ruby/p' ab #查询包括关键字ruby所在所有行
[root@localhost ruby] # sed -n '/\$/p' ab #查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义
[root@localhost ruby] # sed -n '/t[ae]st/p' ab #test和taste等所在行都会被输出
[root@localhost ruby] # sed -n '/GNOME/d' ab #删除GNOME所在行(然而不加-i都是扯淡)
增加一行或多行字符串
[root@localhost ruby]# cat ab
Hello!
ruby is me,welcome to my blog.
end
[root@localhost ruby] # sed '1a drink tea' ab #第一行后增加字符串"drink tea"
Hello!
drink tea
ruby is me,welcome to my blog.
end
[root@localhost ruby] # sed '1,3a drink tea' ab #第一行到第三行后增加字符串"drink tea"
Hello!
drink tea
ruby is me,welcome to my blog.
drink tea
end
drink tea
[root@localhost ruby] # sed '1a drink tea\nor coffee' ab #第一行后增加多行,使用换行符\n
Hello!
drink tea
or coffee
ruby is me,welcome to my blog.
end
[root@localhost ruby] # sed '/good/a I love you' #在所有含有good的行后添加行I love you。
代替一行或多行
[root@localhost ruby] # sed '1c Hi' ab #第一行代替为Hi
Hi
ruby is me,welcome to my blog.
end
[root@localhost ruby] # sed '1,2c Hi' ab #第一行到第二行代替为Hi
Hi
end
替换一行中的某部分
格式:sed ‘s/要替换的字符串/新的字符串/g’ (要替换的字符串可以用正则表达式)
[root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby/bird/g' #替换ruby为bird
[root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby//g' #删除ruby
插入
[root@localhost ruby] # sed -i '$a bye' ab #在文件ab中最后一行直接输入"bye"
[root@localhost ruby]# cat ab
Hello!
ruby is me,welcome to my blog.
end
bye
23.林夕昱作品:鸟哥私房菜之正则表达式3sed21
nl
number lines of file
和cat -n
的区别:nl
不对 空行编号,而cat -n
对所有行编号。sed
对于写成脚本的sed
命令,使用一般的.sh文件的运行方式
,或者是sed -f 脚本文件名 要操作的目标文本文件名
。
sed
脚本样例:
#!/bin/sed -f
# This line is to use add
/good/a hahahahaha
# This line is to use insert, using / if too long
/glad/i /
hehehehehe
g
是全局替换,p
是打印,而w
是另存为:
sed '1,5s/i/III/gw hello_i.txt' hello.txt
:将hello.txt
的1-5行的小写字母i全部替换成三个大写字母III,并另存为hello_i.txt
文件。
24林夕昱作品:鸟哥私房菜之正则表达式4sed22
25林夕昱作品:鸟哥私房菜之正则表达式 - 5
awk
我们用的awk
实际上是gawk(GNU awk)
,在/bin
和/usr/bin
中awk
为指向gawk
的软链接。
和sed
一样awk
有三种用法,主要是命令行的这一种:
awk [-F field-separator] 'commands' input-file(s)
其中,commands 是真正awk命令,[-F域分隔符]是可选的,默认为空格或tab。 input-file(s) 是待处理的文件。
用cut -d ' ' -f5
获取第五部分时,如果中间的分隔符是多个空格,就跪了。但是awk
可以无视多个空格连续的情况,比如awk '{print $5}'
,输出第五部分。注意命令部分别忘了用单引号和大括号。
awk 'pattern {action}' filenames
:比如awk -F ':' '/lgl/ {print $7}' /etc/passwd
输出lgl所在行的第七部分(即lgl所用的shell类型)。