鸟哥私房菜大二暑假

鸟哥私房菜

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规划出inodeblock 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
    1. 首先根据/的inode找到/的数据区,在这里面找到etc名字对应的inode;
    2. 再根据etc的inode找到etc的数据区,在里面找到vsftpd名字对应的inode;
    3. 再根据vsftpd的inode找到vsftpd的数据区,在里面找到vsftpd.conf名字对应的inode;
    4. 最后根据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-00UUID)               /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=100dd < /dev/zero > /tmp/swap2 bs=1M count=100:bs是block size,count是block的数量。然后使用swapon /tmp/swap1swapoff /tmp/swap1就可以对swap分区进行挂载或卸载了
    当然还有一种方法是用fdisk分出一块儿磁盘比如/dev/sda2,然后mkswap /dev/sda2将其变成swap分区,再使用swapon/swapoff

11.鸟哥私房菜2nd之文件的压缩与打包

对于压缩文件,一般我们按照压缩工具对压缩包起名字,如zip对应.ziptar对应.targzip对应.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 testunzip 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?wordnN
    删除
    x:向后删除,相当于Delnx向后删除n个
    X:向前删除,相当于BackspacenX向前删除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 3root: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/binawk为指向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类型)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值