学习笔记|Linux

本文最后更新于:1 个月前

零、背景

01Linux 和 windows 不同

  1. linux严格区分大小写

  2. 所有内容以文件形式保存,包括硬件

  3. 没有任何扩展名区分文件类型

    压缩包: .gz .bz2 .tar.bz2 .tg2

    二进制软件包: .rpm

    网页文件: .html .php

    脚本文件: .sh

    配置文件: .conf

  4. Window 下程序不能直接在linux中安装和运行

02字符界面的优势

  1. 占用资源少
  2. 减少出错、被攻击的可能性

一、分区设备文件名与挂载

01设备文件名

/dev/hda1IDE硬盘接口(100M/s)
/dev/sda1SCSI硬盘接口(200M/s)、SATA硬盘接口(500M/s)

02挂载

  1. 必须分区
    • /(根分区)
    • swap(交换分区)(内存2倍,不超过2GB)
  2. 推荐分区
    • /boot(启动分区,200MB)

3.

二、Linux命令

01命令基本格式

1.1登陆

[root@localhost~]#
  • root: 用户名

  • localhost: 主机名

  • ~: 表示当前位置在 ~

  • #: 表示当前用户是超级用户,普通用户是 $

1.2格式

命令 【选项】【参数】

注意:

  1. 个别命令使用不遵循格式
  2. 当有多个选项时,可以写在一起
  3. 简化选项与完整选项(-a 等于 -all)

1.3命令类型

  • 文件处理命令
  • 文件搜索命令
  • 帮助命令
  • 压缩和解压缩命令
  • 关机和重启命令
  • 其他常用命令

02目录处理命令

2.1查询目录中的内容 ls

ls【选项】【文件或目录】

ls -l /dev/
选项备注
-a显示所有文件、包括隐藏文件
-l显示详细信息【 ls -l 简写成 ==ll== 】
-d查看目录属性
-h人性化显示文件大小
-i显示文件索引节点号(inode)
drwxr-xr-x   5 root1  root   160  9 19 17:10 java
  • drwxr-xr-xd rwx r-x r-x

    • d:表类型,-是文件,d是目录,/是软连接文件,另外有:块设备文件、字符设备文件、套接字文件、管道文件
    • rwx:前三个是 uers所有者
    • r-x:中间三个是 group所属组
    • r-x:后面三个是 other其他人
      • r是read,w是write,x是执行
  • 5:引用计数

  • root1:所有者

  • root:所属组

  • 160:字节大小

  • 9 19 17:10 :修改时间为9月18日 17:10

  • java:文件名

2.2建立目录 mkdir

mkdir【目录名】:make directories(目录)

# 创建一个叫 test 的目录
mkdir test

# 递归创建多层目录
mkdir -p test1/test2/test3

2.3切换所在目录 cd

cd【目录名】

简化操作备注
cd ~进入home目录
cd进入home目录
cd -进入上次目录
cd ..进入上级目录
.表示当前目录

相对路径:从当前目录开始

绝对路径:从根目录开始

2.4查询目录位置 pwd

pwd:print working directory

2.5删除空目录 rmdir

rmdir:remove empty directories

注:只能删除空目录,非空目录不能删除

2.6删除文件或目录 rm

rm:remove

# 删除目录【rm只删除文件,不删除目录】(递归删除)
rm -r

# 强制删除
rm -rf

# 删除temp目录下所有内容【加*】
rm -rf /temp/*

# 删除temp【不加*】
rm -rf /temp/

03文件处理命令

3.1复制命令 cp

cp【选项】【原文件名或目录名】【目标目录】:copy

选项备注
-r复制目录,不加 -r 复制文件
-p连带文件属性复制
-d若源文件是链接文件,则复制链接属性
-a相当于 -pdr 【所有都一样,包括时间】
# 复制aaa.cfg并改名成bbb.cfg
cp aaa.cfg /tmp/bbb.cfg

# 仅复制
cp aaa.cfg /tmp/

3.2剪切命令 mv

mv【源文件或目录】【目标目录】

# 将japan/剪切到/tmp目录下
mv japan/ /tmp/

# 将japan/剪切到/tmp/目录下,并改名为japan01
mv japan/ /tmp/japan01

# 改名
mv aaa.cfg bbb.cfg

3.3常用目录名

系统目录结构备注
/根目录
/bin命令保存目录,Binary的缩写,存放普通用户可读取的命令,sbin存放超级用户能访问的命令
/boot启动目录,保存着启动相关的文件
/dev设备文件保存目录,Device(设备)的缩写,存放的是硬件、特殊命令
/etc配置文件保存目录,存放所有的系统管理所需要的配置文件和子目录
/home用户的主目录
/lib系统库保存目录,数据库
/mnt系统挂载目录
/media用户临时挂载目录
/sys内存的挂载点,不能操作
/proc内存的挂载点,不能操作
/tmp临时目录
/usr系统软件资源目录
/var系统相关文档内容

04Linux链接命令 ln

ln【选项】【原文件】【目标文件】:link

命令备注
ln创建硬链接
ln -s创建软链接
  • 硬链接特点
  1. 拥有相同的 i节点和储存block块,可以看成是同一个文件
  2. 只能通过 i节点识别
  3. 不能跨分区
  4. 不能针对目录使用
  • 软链接特点
  1. 类似windows快捷方式
  2. 软链接拥有自己的 i节点和block块,数据块存的是原文件的 i节点
  3. 软链接权限由原链接控制它
  4. 要绝对路径

05文件搜索命令

5.1文件搜索命令 locate

locate 【文件名】

在后台数据库中按文件名搜索,搜索速度更快(数据库不实时更新,一天更新一次)。

/var/lib/mlocate/mlocate.db 是 locate 命令搜索的数据库。(也可能是 slocate.db,不同版本不同。)

命令需要安装并更新数据库 mlocate.db:

yum install mlocate  # 注意是 mlocate
updatedb

使用:

# 查找 hello.cc 文件
lacate hello.cc
updatadb    # 强制更新命令。比如新创建的文件需要更新后才能搜索到。

配置文件 \etc\update.conf (解决问题:为什么不搜索 /tmp 目录?):

# 是否开启搜索限制

PRUNE_BIND_MOUNTS = "yes"

# 搜索时,不搜索文件系统
PRUNEFS = "9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset debugfs devpts ecryptfs exofs fuse fuse.sshfs fusectl gfs gfs2 gpfs hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs nfs4 nfsd pipefs proc ramfs rootfs rpc_pipefs securityfs selinuxfs sfs sockfs sysfs tmpfs ubifs udf usbfs fuse.glusterfs ceph fuse.ceph"

# 搜索时,不搜素文件类型
PRUNENAMES = ".git .hg .svn"

# 搜索时,不搜索的路径
PRUNEPATHS = "/afs /media /mnt /net /sfs /tmp /udev /var/cache/ccache /var/lib/yum/yumdb /var/spool/cups /var/spool/squid /var/tmp /var/lib/ceph"

5.2命令搜索命令 whereis、which

which 可以查找别名,whereis 不可以。

(1)whereis 【命令名】

搜素命令所在路径、及帮助文档所在的位置。

# 查找 nginx 命令的路径。
whereis nginx
选项备注
-b只查找可执行命令
-m只查找帮助文件

(2)which 【命令名】

查找命令所在路径、及别名。

# 查找 ls 命令,会显示别名。
[root@localhost /]# which ls
alias ls='ls --color=auto'
	/usr/bin/ls

(3)$PATH

whereiswhich 命令在环境变量 $PATH 中搜索。

# 查看当前的环境变量,由冒号分割。
[root@localhost etc]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

5.3文件搜索命令 find

避免大范围搜索,会非常耗费系统资源。若负载过大,容易宕机。

(1)find 【搜索范围】【搜索条件】

# 在 / 目录下,寻找名称为 install.log 的文件。
find / -name install.log

# 在 / 目录下,寻找名称为 install.lo? 的文件。? 代表该字符不确定,可能是 g,可能是 k。
find / -name install.log[gk]

# 在 / 目录下,寻找所有者为 root 的文件
find / -user root
通配符备注
*匹配任意内容
?匹配任意一个字符
[]匹配任意一个中括号内的字符
搜索条件备注
-name名称
-iname名称(不区分大小写)
-user所有者
-nouser没有所有者 —> 垃圾文件

(2)find 【搜索范围】【时间】

# 查找 10天 前修改的日志文件。
find /var/log/ -mtime +10
时间选项备注
-1010内的修改文件
1010天当天修改文件
+1010天前修改文件
搜索条件备注
-atime文件访问时间
-ctime改变文件属性的时间
-mtime修改文件内容的时间

(3)find 【搜索范围】【大小】

# 查找当前目录下,文件大小 小于 25KB 的文件。
find . -size -25k
大小(不可以是小数)(小k 和 大M)备注
-2k< 2k 的文件
2k== 2k 的文件
+2k> 2k 的文件
-20M< 20M 的文件

(4)find 【搜索范围】【 i 节点】

# 查找 / 目录下 i 节点是 262422 的文件。
find / -inum 262422

(5)find【搜索范围】【多个条件】

# 查找 /etc 目录下,大于 20k 小于 50k 的文件。
find /etc -size +20k -a -size -50k
逻辑备注
-a与and
-o或or

(6)find 【搜索范围】【条件】-exec 【命令2】{} ;

把搜索到的结果,交给 命令2 执行。

⚠️注意:{} 和 \ 之间有空格;结尾有分号。

# 查找 <10k 的文件,并用 ls -lah 命令显示详细信息。 
find . -size -10k -exec ls -lah {} \;

5.4字符串搜索命令 grep

在文件中匹配符合条件的字符串。

grep 【选项】字符串 文件名

# 查找 spin_lock.cc 文件中的包含 字符串“#include” 的行。
grep "#include" spin_lock.cc 

# 结果如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
选项备注
-i忽略大小写
-v排除指定字符

(1)位置限定匹配

  • 匹配行开头。
yum list installed | grep ^a
grep ^a 1.txt
  • 匹配行结尾。
yum list installed | grep a$
  • 匹配单词开头。
yum list installed | grep "\<maria"  # 匹配以 db 开头的单词所在的行,例如mariadb,注意要有双引号
  • 匹配单词结尾。
yum list installed | grep "db\>"     # 匹配以 db 结尾的单词所在的行,例如mariadb,注意要有双引号
  • 匹配单词。
yum list installed | grep "mariadb"  # 只能匹配完整的单词 mariadb,例如:可以匹配 mariadb-server,不能匹配 mariadbbb-server

(2)字符匹配

  • . 匹配任意一个字符。
yum list installed | grep .um  # um 前面必须有一个字符。
  • [mn] 匹配 [] 里的任意一个字符。
➜  ~ yum list installed | grep "[mn]aria"   # 注意双引号
mariadb.x86_64                        1:5.5.65-1.el7                   @base    
mariadb-libs.x86_64                   1:5.5.65-1.el7                   @anaconda
mariadb-server.x86_64                 1:5.5.65-1.el7                   @base
  • [^yd] 匹配除 [] 中字符的其他任一字符。
yum list installed | grep "[^yd]um"     # 注意双引号
numactl-libs.x86_64                   2.0.12-5.el7                     @anaconda
perl-Data-Dumper.x86_64               2.145-3.el7                      @base
  • \w 【小写w】匹配文字和数字字符,也就是 [A-Za-z0-9]。
grep "\w" 1.txt  # 必须有双引号
  • \W 【大写W】匹配非文字和数字字符,”\w” 的反置形式。
grep "\W" 1.txt  # 必须有双引号

(3)次数限定匹配

  • * *前面的字符可以重复 0 次或者 多次。
grep "a*b"   # 表示 a 可以出现多次或者0次
  • x\{m\} 匹配 字符 x重复 m 次 的行。
➜  ~ yum list installed | grep "0\{3\}"   # 查找重复 3 次 0 的行。
iwl1000-firmware.noarch  
iwl2000-firmware.noarch   
iwl5000-firmware.noarch    
iwl6000-firmware.noarch  
iwl6000g2a-firmware.noarch   
iwl6000g2b-firmware.noarch
  • x\{m,\} 匹配 字符 x 重复 m 次或者 m 次*以上*** 的行。[m, +∞)
grep "0\{2,\}" 1.txt   # 查找 0 重复 2 次以上的行。
  • x\{m, n\} 匹配 字符 x 重复 m 次或者 m 次以上,不超过 n 次 的行。 [m, n]
grep "0\{2,3\}" 1.txt  # 查找 重复次数在 [2, 3] 之间的行。

(4)拓展匹配模式

06帮助命令

(1)man 命令

manual

获取指令命令的帮助

man ls
  • /-d 定位到选项为 -d 的位置。
  • n 向下翻。
  • man 的级别 1~9。
级别内容
1查看命令的帮助
2查看别内核调用的函数的帮助
3查看函数和函数库的帮助
4查看特殊文件的帮助
5查看配置文件的帮助
6查看游戏的帮助
7查看其他杂项的帮助
8查看系统管理员可用命令的帮助
9查看内核相关文件的帮助

(2)help 命令

  • 【外部命令】–help
ls --help
  • help 【内部命令】
help cd

(3)PS:如何判断是否是 shell 的内部命令?

  • tpye 查看命令是内部命令还是外部命令

    type ls

(4)info 命令

超详细的帮助文档

选项备注
-回车进入子帮助页面(带*号标记)
-u进入上一层页面
-n进入下一个帮助小节
-p进入上一个帮助小节
-q退出

07压缩与解压缩命令

信息:

uname -a

清屏:

clear

reset

crtl + L

查看当前使用的 shell

echo $SHELL

shell>> chsh
Changing fihanging shell for user1
Password: [del]
New shell [/bin/tcsh]: ### [是目前使用的 shell]
[del]
shell>> chsh -l ### 展示 /etc/shells 档案内容
/bin/bash
/bin/sh
/bin/ash
/bin/bsh
/bin/tcsh
/bin/csh
# chsh -s /bin/csh //改变当前设置为 /bin/csh
Changing shell for root.
Shell not changed.

更改完 shell 重启一下。

查看当前用户:whoami

安装 ifconfig 命令。

  • 发现没有 ifconfig 命令
  • yum install ifconfig 安装不上
  • yum search ifconfig 查看 ifconfig 在哪个安装包中。发现是 net-tools.x86_64
  • yum install net-tools.x86_64 发现安装不上
  • yum install net-tools
  • 安装成功!

yum remove mysql

删除软件


本博客所有文章均个人原创,除特别声明外均采用 CC BY-SA 4.0协议,转载请注明出处!

 目录

致敬李文亮及各路英雄好汉!