Linux学习笔记

这篇博客详细介绍了Linux文件传输的各种方式,包括ftp、sftp、lrzsz、scp等,并探讨了ssh的免密码登录。此外,还讨论了文件链接、外置存储设备的使用、重定向与管道、命令行交互输入以及各种实用工具,如sed、grep、awk的高级用法,是学习Linux系统管理的好资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件传输

ftp,sftp, vsftp, lrzsz, rcp/scp

ftp: file transfer protocal , 文件传输协议,有很多种软件实现。不具体指某种软件

sftp:secure file transfer protocal 加密文件传输协议

vsftp:very secure file transfer protocal

lrzsz : 采用Zmodem 传输协议的终端文件传输工具

yum install lrzsz -y # 安装
rz # 打开本地系统文件窗口选择并上传
sz fileName #下载文件到本地
stfp userName@hostName:/remote/path
# 在远程系统上执行各种操作
cd / ls / pwd / mv ....
# 在当前机器上执行操作直接在对应的命令前面加一个 l 就可以
lcd / lls / lpwd / lmv .... 
put filePath # 上传文件本地文件到远程机器
get filePath # 下载远程服务器文件到本地
# sftp 只能执常规的文件处理命令,不能运行程序,或者系统服务等一些需要执行权限的命令

scp 快速远程复制文件

scp [options] srcFilePath targetFilePath

scp常用参数

-r : 递归复制目录

-p : 保留文件原始修改时间,访问时间等信息

-q : 安静模式,不显示进度条,警告信息

-v : 啰嗦模式 , 显示详细的信息

-C : 启用文件压缩

-l n: 显示传输带宽为n kb/s

远程登录
ssh user@host:/working/dir

ssh 免密码登录

ssh 采用非对称加密来对传输进行加密,可以在本机生成 pk-sk,将pk上传到远程服务器上就可以实现免密码登录

# 生成密钥对
ssh-keygen 
# 将公钥复制到远程服务器上
ssh-copy-id [-p port] user@host
# 登录远程主机
ssh user@host
文件链接

文件连接相当于文件的快捷方式,linux 中文件连接分为 软连接和硬链接。

软连接:删除源文件导致软连接不可用,删除软连接不会删除源文件

硬链接:删除源文件硬链接任然可用,删除硬连接不会删除源文件

ln path/to/arc/file path/to/link/file # 为源文件创建一个硬链接文件
ln -s path/to/arc/file path/to/link/file # 为源文件创建一个软链接文件
ls -lh /etc/rc.local

在这里插入图片描述
文件链接的原理

linux文件系统中,一个文件大概可以分为三个部分 文件名,元数据[inode] 和 数据块[data],

文件名: 文件的名称,路径,对应文件Inode等等…

inode : inode包含很多的文件元信息,但不包含文件名,例如:字节数、属主UserID、属组GroupID、读写执行权限、时间戳等。

而文件名存放在目录当中,但Linux系统内部不使用文件名,而是使用inode号码识别文件。对于系统来说文件名只是inode号码便于识别的别称。

data: 存放文件内容

srcFile
inode
data
hardLink
softLink
inode
data

inode也会消耗硬盘空间,所以格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区,存放inode所包含的信息。由于这种设计,导致linux 文件存在下面几个特点:

  • 由于每个分区都有自己的inode, 而 硬链接的文件名只是记录了inode编号,因此硬链接只能指向当前分区的文件,软连接指向的是 源文件的 文件名(路径), 因此软连接可以跨分区。
  • 由于分区格式化的时候inode数量就已经确定了,因此,如果系统中存在大量的小文件空文件导致inode耗尽,或出现即使磁盘空间有很多的情况下任然无法创建文件的现象
  • 由于系统内部是通过inode来识别文件的,而常规的mv , rm 操作只是文件名操作,所以当我们用这两个命令删除移动文件的时候,不影响已经在使用这个文件的程序。而不同的是windows中常常出现的文件被占用无法删除的现象。
# 查看系统分区的inode数
df -i
# 查看系统分区可用空间
df -h
# 查看文件的inode信息
stat fileName
# 查看目录下文件的信息,包含inode
ls -lih
# 根据文件inode搜索文件
find / -inum 234556
外置存储设备的使用

mount 与 umount

重定向与管道
  • 输出重定向>,>>

    cmd > targetfile # 将cmd命令的标准输出重定向到targetFile中
    cmd >> targetfile
    # > 每次会清空源文件的内容然后写入
    # >> 将内容追加到文件末尾
    
    echo "systemctl start mysql" >> /etc/rc.local
    
  • 输入重定向 <

    cmd < targetFile # 将targetFile的内容作为cmd的输入
    mysql -uroot -p123456 wesafe_west < wesafe_west.sql;
    
  • 管道

    能让你将一个命令的输出发送给另一个命令。管道能重定向一个进程的标准输出、输入和错误到另一个进程的标准输入,以便于进一步处理。

    cmd1 | cmd2 # 将cmd1 的标准输出作为cmd2的标准输入
    # 例如:
    ls -la | grep ibd
    
  • 输出复制 tee

命令行交互输入
read [options] [hint] [var]

-a:将分裂后的字段依次存储到指定的数组中,存储的起始位置从数组的index=0开始。
-d:指定读取行的结束符号。默认结束符号为换行符。
-n:限制读取N个字符就自动结束读取,如果没有读满N个字符就按下回车或遇到换行符,则也会结束读取。
-N:严格要求读满N个字符才自动结束读取,即使中途按下了回车或遇到了换行符也不结束。其中换行符或回车算一个字符。
-p:给出提示符。
-r:禁止反斜线的转义功能。这意味着"\"会变成文本的一部分。
-s:静默模式。输入的内容不会回显在屏幕上。
-t:给出超时时间,在达到超时时间时,read退出并返回错误。也就是说不会读取任何内容,即使已经输入了一部分。

* 如果没有指定接收变量,可以使用默认的变量 $REPLY 来获取输入内容

自定义输入终止符 <<EOF
linux 输出
  • 标准输出: 1
  • 错误输出: 2
java -jar some.jar > some.log
java -jar some.jar 1> some.log 2>&1;
后台进程
  • &: 放在命令后面可以将命令放到后台执行

    java -jar some.jar &
    
  • ctrl + z 挂起一个前台进程

    java -jar sync.jar
    ctrl + z
    
  • jobs 查看所有后台的进程

  • fg jobid 将一个后台进程拉回到前台运行

  • bg jobid 将一个前台进程放到后台运行

注意事项

上述方法启动的后台进程在当前终端会话结束或退出之后结束运行,要解决这种问题由两种方法:

  • nohup : 表示提醒程序忽略终端的hangup信号不做任何操作。

    nohup java -jar sync.jar > sync.log 2>&1 &
    

    当用户没有自定义重定向程序输入到任何文件时,nohup 会默认把程序的输出重定向到当前目录的nohup.out文件中

  • 子终端()

    (java -jar sync.jar > sync.log 2>&1 &)
    

    子终端的父进程号为1,即 init 进程,因此,运行状态只受linux系统本身的影响

文件分卷与合并

split 文件分割命用于将一个文件按照一定规则分割成多个小文件。

split [-<行数>][-b <字节>][-C <字节>][-l <行数>][要切割的文件][输出文件名]

-<行数> : 指定每多少行切成一个小文件

-a : 文件后缀的长度,默认为2

-d : 使用数字后缀

-b<字节> : 指定每多少字节切成一个小文件
-C<字节> : 与参数"-b"相似,但是在切 割时将尽量维持每行的完整性
[输出文件名] : 设置切割后文件的前置文件名, split会自动在前置文件名后再加上编号

split -b -d 10240 mysql.tar.gz mysql-volumn-
diff 文件比对命令

diff以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录。

diff [-abBcdefHilnNpPqrstTuvwy][-<行数>][-C <行数>][-D <巨集名称>][-I <字符或字符串>][-S <文件>][-W <宽度>][-x <文件或目录>][-X <文件>][--help][--left-column][--suppress-common-line][文件或目录1][文件或目录2]

常用参数

-B或–ignore-blank-lines  不检查空白行。
-c  显示全部内文,并标出不同之处。
-H或–speed-large-files  比较大文件时,可加快速度。
-l<字符或字符串>或–ignore-matching-lines<字符或字符串>  若两个文件在某几行有所不同,而这几行同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异。
-i或–ignore-case  不检查大小写的不同。
-q或–brief  仅显示有无差异,不显示详细的信息。
-r或–recursive  比较子目录中的文件。
-s或–report-identical-files  若没有发现任何差异,仍然显示信息。
-S<文件>或–starting-file<文件>  在比较目录时,从指定的文件开始比较。
-t或–expand-tabs  在输出时,将tab字符展开。
-T或–initial-tab  在每行前面加上tab字符以便对齐。
-u,-U<列数>或–unified=<列数>  以合并的方式来显示文件内容的不同。
-w或–ignore-all-space  忽略全部的空格字符。
-x<文件名或目录>或–exclude<文件名或目录>  不比较选项中所指定的文件或目录。
-X<文件>或–exclude-from<文件>  您可以将文件或目录类型存成文本文件,然后在=<文件>中指定此文本文件。
-y或–side-by-side  以并列的方式显示文件的异同之处。
–suppress-common-lines  在使用-y参数时,仅显示不同之处。
–left-column  在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容。

diff -y /etc/wutos/conf/public.properties public.properties 

在这里插入图片描述

“|” 表示前后2个文件内容有不同
“<” 表示后面文件比前面文件少了1行内容
">表示后面文件比前面文件多了1行内容

linux 三剑客 sed , grep , awk
sed

sed 擅长文件内容编辑。

sed [-nihV] [-e<expression>] [-f<script文件>][文本文件]

options:

  • -n :只打印模式匹配的行
  • -e :直接在命令行模式上进行sed动作编辑,此为默认选项
  • -f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作
  • -i :直接修改文件内容
  • -h : 显示帮助
  • -V: 显示版本

expression 的格式为

sed -e 'expr[function]'

expression参数

  • x: x为行号

  • x,y: 表示行号从x到y

  • /pattern: 查询包含模式的行

  • pattern/,x: 在给定行号上查询包含模式的行

  • x,/pattern/: 通过行号和模式查询匹配的行

  • x,y!: 查询不包含指定行号x和y的行

function可以有下面几种:

  • a :匹配的行后新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
  • c :取代匹配的行, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
  • d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
  • i :匹配的行前插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
  • p :答应匹配的行,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
  • s :替换匹配的字符串,通常这个 s 的动作可以搭配正规表示法!
sed -i -e '1,4d' file # 删除第1到第4行
sed -i -e ''/haha/d' # 删除包含haha的行
sed -i -e '/package/a\//sed添加的注释' # 在包含package的行后面添加 一行 //sed添加的注释
sed -i -e '/import/i\//sed添加的注释' # 在包含import的行后面添加 一行 //sed添加的注释
sed -i -e 's/10.11.2.81/10.11.2.97/g' `grep 10.11.2.81 -rl /etc/wutos/conf`
grep

grep 擅长文件内容查找

grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]

–color=auto,高亮显示匹配到内容;
-a 或 --text : 不要忽略二进制的数据。
-A N after,匹配到的行的后N行;
-B N before,匹配到的行的前N行;
-c 计算符合样式的列数。
-C N both,匹配到的行的前后N行;
-e <范本样式>,指定字符串做为查找文件内容的样式;
-E 支持扩展正则表达式,相当于使用"egrep";
-f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
-h 或 --no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。
-l 或 --file-with-matches : 列出文件内容符合指定的样式的文件名称。
-L 或 --files-without-match : 列出文件内容不符合指定的样式的文件名称。
-i ignorecase,忽略大小写;
-n 在显示符合样式的那一行之前,标示出该行的列数编号。
-o match-only,只输出匹配到内容;
-P 支持PERL正则表达式;
-q 静默模式,不输出结果
-r 此参数的效果和指定"-d recurse"参数相同。
-s 不显示错误信息;
-v invert,反向匹配;
-x 只显示全列符合的列。
-w 英文字符(数字+字符+下划线),匹配整个单词,如果字符串包含这个单词,则不匹配。

grep -an -A[BC] 10 "pubic final class String" String.java # 显示包含 "pubic final class String" 的行的后十行的内同和行号
grep -a -c "public" String.java # 统计包含public的行的总数
grep -a  "public static class" -r[lho] java/lang/ #搜索所有包含静态类的文件
awk

awk 擅长与行内容操作

awk [options] 'BEGIN{ commands } pattern{ commands } END{ commands }'
awk 执行流程

BEGIN: 开始处理文件之前执行一次 BEGIN,常用于变量定义,复制,覆盖变量等

pattern {command} : 可以有多个, awk 每处理一行数据都会执行 能匹配上的pattern后面的command ,pattern 可以省略,没有默认对所有行执行

END: 文件处理完后执行,常用于统计

常用参数

-F fs 指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。
-f scripfile 从脚本文件中读取awk命令。

awk常用内置变量
变量描述
$n当前记录的第n个字段,字段间由FS分隔
$0完整的输入记录
FILENAME当前文件名
FNR各文件分别计数的行号
FS字段分隔符(默认是任何空格)
NF一条记录的字段的数目
NR已经读出的记录数,就是行号,从1开始
OFS输出记录分隔符(输出换行符),输出时用指定的符号代替换行符
ORS输出记录分隔符(默认值是一个换行符)
RS记录分隔符(默认是一个换行符)
awk运算符
运算符描述
= += -= *= /= %= ^= **=赋值
?:C条件表达式
||逻辑或
&&逻辑与
~ 和 !~匹配正则表达式和不匹配正则表达式
< <= > >= != ==关系运算符
空格连接
+ -加,减
* / %乘,除与求余
+ - !一元加,减和逻辑非
^ ***求幂
++ –增加或减少,作为前缀或后缀
$字段引用
in数组成员
awk内置函数
awk中的条件与循环
# if
if(NR == 1) print $0 
if(NR == 1) { print "匹配结果:"$0 }
if(NR == 1) { ... } else { ... }
# for
for (initialisation; condition; increment/decrement) { action }
# while
while (condition) { ... }
# 循环中使用break和continue
# Exit 函数接收一个int值,表示退出状态码
# Exit 执行后会退出 终止循环并退出awk命令的执行
# 获取脚本运行的返回码
echo $? 
awk使用举例
cat assist.sql | sed 's/INSERT INTO `wesafe_west`.`data_sync_assist_status`//g;' | sed 's/(//g;' | sed 's/)//g' |awk -FVALUES '{if(NR==1) { print $1;}}{print $2}' | sed 's/,/\t\t\t\t\t/g' > result.txt
xargs

xargs 可以将管道内容或者标砖输出的内容作为指定命令的参数 执行

ps -ef | grep weed | grep -v grep | awk '{print $2}' | xargs kill
/dev/null, /dev/zero, /dev/random 与 /dev/urandom
  • /dev/null : 数据黑洞,任何输入到他的数据将被丢弃
  • /dev/zero : 无限数据桶,能产生无限量的空数据
  • /dev/random /dev/urandom : 随机数据桶,可以不断产生随机数
# 创建一个10M 的空文件
dd if=/dev/zero of=/home/placeHolder.data bs=10240 count=10
# 生成随机数
cat /dev/urandom | od -x | head -n 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值