文章目录
  1. 1. 文件系统
    1. 1.1. 非纯文本文件查看 od
    2. 1.2. ls按容量,时间查询
    3. 1.3. 完全复制
    4. 1.4. touch修改文件时间
    5. 1.5. 文件隐藏属性attr
      1. 1.5.1. chattr
      2. 1.5.2. lsattr
    6. 1.6. Ext2文件系统介绍
    7. 1.7. 文件链接: ln
  2. 2. Device/Driver
    1. 2.1. CMD-磁盘
    2. 2.2. 查询文件系统
    3. 2.3. 磁盘分区fdisk
    4. 2.4. 磁盘格式化mkfs
    5. 2.5. 磁盘检验fsck,badblocks
    6. 2.6. iso镜像loop模式挂载
  3. 3. Shell
    1. 3.1. 变量
      1. 3.1.1. 内置命令
      2. 3.1.2. 变量内容
    2. 3.2. 历史命令
      1. 3.2.1. 查询历史命令
      2. 3.2.2. 执行历史命令
    3. 3.3. 数据流重定向
      1. 3.3.1. > >> << <描述
      2. 3.3.2. > >>区别
      3. 3.3.3. 错误输出
      4. 3.3.4. 标准输入
      5. 3.3.5. 命令判断
    4. 3.4. 管道Pipe
      1. 3.4.1. 选取命令
        1. 3.4.1.1. cut
        2. 3.4.1.2. grep
      2. 3.4.2. 排序命令
        1. 3.4.2.1. sort
        2. 3.4.2.2. uniq
        3. 3.4.2.3. wc
      3. 3.4.3. 双向重定向
      4. 3.4.4. 字符转换
        1. 3.4.4.1. tr
      5. 3.4.5. 数据合并
        1. 3.4.5.1. join
        2. 3.4.5.2. paste
      6. 3.4.6. 切割/合成
        1. 3.4.6.1. split
        2. 3.4.6.2. cat
      7. 3.4.7. 参数代换
      8. 3.4.8. 减号-
  4. 4. Reference

文件系统

非纯文本文件查看 od

od -t [filetype] filename

1
[email protected]:/var/log$ od -t c Xorg.1.log

ls按容量,时间查询

1
2
3
ls -h #容量
ls --full-time #完整时间
ls --time=[use,atime,ctime] #分别对应下面的touch三种情况

ls -F #输出文件类型

完全复制

1
cp -a ./file1 /another/floder/file2

-a == -pdr
-p:复制文件属性
-d:如果是link file,复制链接文件而不是链接过去的大文件
-r:递归复制

touch修改文件时间

三种时间在以下情况变化:
modification time(mtime) 内容被改
change time(ctime) 属性或者权限被改变(e.g., 重命名)
access time(atime) 被访问

文件隐藏属性attr

chattr

chattr [+-=] [option]
option(常用):
a(root):只能增加数据,不能修改和删除
d:禁止文件被dump
i(root):禁止基本一切操作(增删改查)

1
2
3
4
5
6
chattr +i testfile
rm testfile
#rm:是否删除有写保护的普通空文件 "testfile"? y
#rm: 无法删除"testfile": 不允许的操作
chattr -i testfile
rm testfile

lsattr

和ls差不多用法
三个option:
-a all
-d 忽略目录内文件
-R 递归
e.g., lsattr -aR

Ext2文件系统介绍

暂时感觉ext2-4这些概念差不多..
Ext2文件系统采用的是 Indexed Allocation(索引式文件系统),和数据结构中的结构体指针差不多,windows那种的话应该和U盘的
super block: 记录文件系统的整体信息,包括inode/block总量,使用量,剩余量和文件系统的格式和相关信息
inode: 记录文件属性,一个文件占用一个inode,同时记录该文件数据所在的block号码
block: 实际记录文件的内容,文件过大会占用多个block
磁盘的碎片整理==>51CTO-明诚阁

文件链接: ln

hard link硬链接

无法
1.链接目录
2.跨文件系统

和复制还是有区别的,至少硬链接产生的文件使他们两个文件指向同一个block文件

symbolic link符号链接,对应于windows的快捷方式

1
2
3
4
cd /tmp
ln -s ~ testFolder #-s symbolic
ls -l
#lrwxrwxrwx 1 a1exlism a1exlism 13 2月 14 22:28 testFolder1 -> /home/a1exlism

后记
ln -s 中的文件目录需要绝对路径,类似于./的相对路径无效

Device/Driver

CMD-磁盘

1.df [option] file/floder
df ==>disk and floder
-i 以inode显示 -h humanized人性化显示(kb,mb,etc)

df /

2.du
du ==> disk usage 磁盘使用状态
-s sum只显示总量

du ~

查询文件系统

dumpe2fs [-bh] 设备文件名
-b broken size 显示坏道
-h 只显示superblock

磁盘分区fdisk

1
2
df #查看大致文件系统的物理地址
fdisk /dev/sdb

之后按m就能解决一切了..不过小心按w(保存)

磁盘格式化mkfs

make file system

mkfs [-t 文件系统格式] 设备文件名
文件格式:ext4,exFat…

不细搞了

磁盘检验fsck,badblocks

file system check

mkfs [-t 文件系统格式] [option] 设备文件名

iso镜像loop模式挂载

un/mount需要root权限

1
2
3
4
mkdir /tmp/mountFloder
mount -o loop /media/a1exlism/Data/ISO/ubuntu-15.04-desktop-amd64.iso
df #查看一下有没有挂载
umount /tmp/mountFloder

Shell

command记忆功能(注销之后才会被记录):

vim .bash_history

分行输入,添加\,enter
bash中引用变量:

1
2
3
4
#进入当前kernel
cd /lib/modules/`uname -r`/kernel
#`表示优先执行
cd /lib/modules/$(uname -r)/kernel

变量

内置命令

  1. 环境变量

    env

  2. 所有变量

    set

  3. 自定义变量转换为环境变量

    export val

  4. 变量声明
    -a arr -i integer
    -x export -r readonly

    declare [-aixr] val

  5. 删除变量/函数
    -v variable only -f function only

    unset [-vf] mylove

  6. 用户限制

    ulimit
    ulimit [-SHacdfltu] 配额

变量内容

0x1 删除

#/## 从左往右删除最短/最长一条
%,%%和#一样,不过是从右往左

1
2
3
4
5
6
7
8
9
10
11
12
#root权限,没有:的情况下
mailtest=$MAIL
#删除顶级目录
echo ${mailtest#/*/}
#删除末级目录
echo ${mailtest%/*}
#有:情况下
path=$PATH
#只保留第一个环境
echo ${path%%:*}
#只保留最后一个环境
echo ${path1##*:}

0x2 替换

  1. 直接替换

    ${变量/oldWord/newWord}

1
2
3
4
#只替换首个
echo ${path/sbin/SBIN}
#全局替换
echo ${path//sbin/SBIN}
  1. 判断型替换
    :-判断USERNAME变量是否存在,不存在则创建变量并赋值为a1exlism(只有-的情况下在变量为空状态无法赋值)

    USERNAME=${USERNAME:-a1exlism}

历史命令

查询历史命令

前面提到~/.bash_history,history则是读取

history [n] 最近n条
history [-c] 清除历史
history [-raw] 读取/添加/写入histfiles(添加和写入感觉一模一样..)

执行历史命令

!n !command 就不讲了

!!执行上一条命令

数据流重定向

顾名思义,数据放入了一个缓冲区,看到重定向符号就将数据转移

> >> << <描述

单个字符==>替换
双字符===>累加
和c++一样>输出,<输入
代码:0输入 1输出 2错误输出

栗子:

> >>区别

1
2
3
4
5
6
#将ll内容输出至rootfile,terminal不显示
[email protected]:~$ ll / > /tmp/rootfile
#用>>将~的内容累加至rootfile
[email protected]:~$ ll ~ >> /tmp/rootfile
#符号>将rootfile进行重写,原先的内容全部消失
[email protected]:~$ ll / > /tmp/rootfile

错误输出

涉及到前面提到的代码–
0x1. stdout输出至file1,stderr输出至file2

find / -name *.desktop >file1 2>file2

0x2. 丢弃错误数据==>放到黑洞设备/dev/null

find / -name *.desktop >file1 2>/dev/null

0x3. 将错误正确数据分开放入同一个文件

1.find / -name .desktop > file 2>> file =, =
2.find / -name
.desktop > file 2>&1 这个表示不理解,放弃

标准输入

0x1. 栗子

1
2
3
4
5
6
7
#cat 创建文件
cat catfile
stdin
Ctrl+D
#利用文件写入
cat > catfile < ~/.bash_history
diff ~/.bash_history catfile #无输出

0x2. <<为结束字符

cat > catfile << “EOF”

命令判断

&& 两者为同或关系,a1->b1,a0->b0
|| 两者为异或关系,a1->b0,a0->b1
执行顺序为从左到右的顺序执行

1
2
3
#不清楚/tmp/abc的存在,直接创建/tmp/abc/def文件
ls /tmp/abc || mkdir -p /tmp/abc && touch /tmp/abc/def
#ls 报错是因为判断是在创建之前..

管道Pipe

| 类似于重定向将标准输出以某种方式输出

ll / | less

选取命令

cut

cut -d ‘words’ -f number / cut -c 字符范围

example:

1
2
3
4
5
6
7
#功能和js的split函数一样,以-d的分隔符分成数组,选取组号
echo $PATH | cut -d : -f 2 #-d delimiter -f fields
#取所有行第12个字符之后的内容
export > file1
export | cut -c 12- >file2 #-c character
#比较一下
colordiff [-c] file1 file2 # -c 为比较所有内容

grep

这部分放在了Linux 查询

排序命令

sort

sort [-option] file

1
2
3
4
5
6
#默认字母排序
cat /etc/passwd | sort
#以每行第三个作为排序依据
cat /etc/passwd | sort -t : -k 3 #-t --field separator -k key(location)-t --field separator -k key(location)
#cut + sort
last | cut -d ' ' -f 1 | sort

uniq

-i 忽略大小写 -c count

uniq [-ic]

1
2
#记录独立用户登陆,依名字排序并统计次数
last | cut -d ' ' -f 1 | sort | uniq -c

wc

word count字数统计 -l行 -w字 -m字符

wc [-lwm]

1
2
#记录登陆系统的总人次 grep1排除空白行 grep2排除wtmp
last | grep [a-zA-Z] | grep -v wtmp | wc -l

双向重定向

tee -> T 两边都行(stdout+file) -a appand添加(否则覆盖)

tee [-a] file

1
2
#存入文件file并在屏幕以less方式显示
cat /var/log/kern.log | tee /tmp/testFloder/file | less

字符转换

tr

translate or remove
[option]: -d delete -s squeeze-replace

tr [-ds] string

1
2
3
4
#切换大写
last | tr -s [a-z] [A-Z]
#删除冒号
echo $PATH | tr -d :

数据合并

join

-t 分隔 -i 无视大小写 -1 n 文件1用第n个字段进行分析

join [-ti12] file1 file2

join之前一般需要sort一下

1
2
3
4
5
6
#合并passwd和shadow数据,stdout之后并记录在test文件中
join -t : /etc/passwd /etc/shadow |tee test
#先看看相同之处
head -n 3 /etc/passwd /etc/group #相同之处在file1第四个字段和file2的第三个字段
#文件1以第四个字段GID作为分析内容
join -t : -1 4 /etc/passwd -2 3 /etc/group

合并后的输出第一字段为相同字段,后面不重复显示

paste

数据直接黏贴,[tab]作为分隔符

paste /etc/passwd /etc/shadow

切割/合成

split

-b –bytes 可加单位 -l line number

split [-bl] file PreFix

cat

利用数据流重定向

cat files* >> file

1
2
3
4
# 200M文件切割成四份,每份60M--videos会被分成四部分,只有第一个能看,也不能调进度
cd /tmp/testFloder; split -b 60m ~/Downloads/video.rmvb videos
# 合并上述文件
cat videos* >> viedo.rmvb #确实很棒 数据流重定向

参数代换

xargs为不支持管道符号的command提供了额外的支持
-0 特殊字符格式化 -e EOF符 n 次数

xargs [-0epn] command

1
2
3
4
#查询前三个账户并用echo来显示 (栗子不怎么恰当,不过原书finger的栗子已失效)
cut -d : -f 1 /etc/passwd | head -n 3 |xargs echo
#echo5个账号,第三个账号为bin,xargs以'bin'作为EOF标识
cut -d : -f 1 /etc/passwd | xargs -n 5 -e 'bin' echo #注意-e'bin'连在一起

减号-

在一条命令中(管道符隔开),前面的stdout作为后面的stdin(变量存储)

1
2
# 类似于匿名函数,减少了文件名的产生
tar -cvf - /tmp/testFloder/ | tar -xvf -

Reference

《鸟哥私房菜》

文章目录
  1. 1. 文件系统
    1. 1.1. 非纯文本文件查看 od
    2. 1.2. ls按容量,时间查询
    3. 1.3. 完全复制
    4. 1.4. touch修改文件时间
    5. 1.5. 文件隐藏属性attr
      1. 1.5.1. chattr
      2. 1.5.2. lsattr
    6. 1.6. Ext2文件系统介绍
    7. 1.7. 文件链接: ln
  2. 2. Device/Driver
    1. 2.1. CMD-磁盘
    2. 2.2. 查询文件系统
    3. 2.3. 磁盘分区fdisk
    4. 2.4. 磁盘格式化mkfs
    5. 2.5. 磁盘检验fsck,badblocks
    6. 2.6. iso镜像loop模式挂载
  3. 3. Shell
    1. 3.1. 变量
      1. 3.1.1. 内置命令
      2. 3.1.2. 变量内容
    2. 3.2. 历史命令
      1. 3.2.1. 查询历史命令
      2. 3.2.2. 执行历史命令
    3. 3.3. 数据流重定向
      1. 3.3.1. > >> << <描述
      2. 3.3.2. > >>区别
      3. 3.3.3. 错误输出
      4. 3.3.4. 标准输入
      5. 3.3.5. 命令判断
    4. 3.4. 管道Pipe
      1. 3.4.1. 选取命令
        1. 3.4.1.1. cut
        2. 3.4.1.2. grep
      2. 3.4.2. 排序命令
        1. 3.4.2.1. sort
        2. 3.4.2.2. uniq
        3. 3.4.2.3. wc
      3. 3.4.3. 双向重定向
      4. 3.4.4. 字符转换
        1. 3.4.4.1. tr
      5. 3.4.5. 数据合并
        1. 3.4.5.1. join
        2. 3.4.5.2. paste
      6. 3.4.6. 切割/合成
        1. 3.4.6.1. split
        2. 3.4.6.2. cat
      7. 3.4.7. 参数代换
      8. 3.4.8. 减号-
  4. 4. Reference