赞
踩
mkdir [选项] [目录名]
选项:
-p ///创建多层文件 (递归创建)
mkdir -p a/b/c
-v ///显示创建信息
-m /// 创建目录的同时,创建权限
mkdir -m 777 abc
rmdir abc ///只能删除空目录
rmdir abc/bcd/cde ///删除最后一个目录
rmdir -pv abc/bcd/cde ///递归删除三个目录
创建文件的4中方式:
- touch filename.txt
touch touvh.txt- vi filename
vi vi.txt- echo “写入内容”>filename.txt 写内容至文件
echo “echo.txt”>echo.txt- cat > filename.txt 显示文件内容
cat >cat.txt
-touch 创建新文件或修改文件的时间属性
touch [选项] [新文件名]
touch -d "5:00am" touch2.txt ///定义创建日期为5:00的文件
选项:
-a:修改文件的访问时间为当前系统时间
-m:修改文件的修改时间为系统当前时间
-d:将文件的修改时间修改为指定的时间
rm [选项] [文件名] ///删除文件
-i:删除之前进行确认
-f:强制删除,不进行确认
-r:递归删除
-v:显示详细过程
-ln
ln [选项] 目标文件/程序 创建位置及名称
选项:
-s
vi编辑器是所有Unix及Linux系统下标准的编辑器,介绍一下它的用法和一小部分指令。由于对Unix及Linux系统的任何版本,vi编辑器是完全相同的,因此您可以在其他任何介绍vi的地方进一步了解它。Vi也是Linux中最基本的文本编辑器,学会它后,您将在Linux的世界里畅行无阻。
在所有的命令执行前,先按Esc
基本上vi可以分为三种状态,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:
不过一般我们在使用时把vi简化成两个模式,就是将底行模式(last line mode)也算入命令行模式command mode)。
$ vi myfile
不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。初次使用vi的人都会想先用上下左右键移动光标,结果电脑一直哔哔叫,把自己气个半死,所以进入vi后,先不要乱动,转换到「插入模式(Insert mode)」再说吧!
切换至插入模式(Insert mode)编辑文件
在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。
Insert 的切换
您目前处于「插入模式(Insert mode)」,您就只能一直输入文字,如果您发现输错了字!想用光标键往回移动,将该字删除,就要先按一下「ESC」键转到「命令行模式(command mode)」再删除文字。
退出vi及保存文件
在「命令行模式(command mode)」下,按一下「:」冒号键进入「Last line mode 」
: w filename (输入 「w filename」将文章以指定的文件名filename保存)
: wq (输入「wq」,存盘并退出vi)
: q! (输入q!, 不存盘强制退出vi)
1.插入模式
按「i」切换进入插入模式「insert mode」,按"i"进入插入模式后是从光标当前位置开始输入文件;
按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字;
按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。
从插入模式切换为命令行模式
按「ESC」键。
移动光标
vi可以直接用键盘上的光标来上下左右移动,但正规的vi是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格。
按「ctrl」+「b」:屏幕往"后"移动一页。
按「ctrl」+「f」:屏幕往"前"移动一页。
按「ctrl」+「u」:屏幕往"后"移动半页。
按「ctrl」+「d」:屏幕往"前"移动半页。
按数字「0」:移到文章的开头。
按「G」:移动到文章的最后。
按「$」:移动到光标所在行的"行尾"。
按「^」:移动到光标所在行的"行首"
按「w」:光标跳到下个字的开头
按「e」:光标跳到下个字的字尾
按「b」:光标回到上个字的开头
按「#l」:光标移到该行的第#个位置,如:5l,56l。
删除文字
「x」:每按一次,删除光标所在位置的"后面"一个字符。
「#x」:例如,「6x」表示删除光标所在位置的"后面"6个字符。
「X」:大写的X,每按一次,删除光标所在位置的"前面"一个字符。
「#X」:例如,「20X」表示删除光标所在位置的"前面"20个字符。
「dd」:删除光标所在行。
「#dd」:从光标所在行开始删除#行
复制
「yw」:将光标所在之处到字尾的字符复制到缓冲区中。
「#yw」:复制#个字到缓冲区
「yy」:复制光标所在行到缓冲区。
「#yy」:例如,「6yy」表示拷贝从光标所在的该行"往下数"6行文字。
「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与"y"有关的复制命令都必须与"p"配合才能完成复制与粘贴功能。
替换
「r」:替换光标所在处的字符。
「R」:替换光标所到之处的字符,直到按下「ESC」键为止。
回复上一次操作
「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次"u"可以执行多次回复。
更改
「cw」:更改光标所在处的字到字尾处
「c#w」:例如,「c3w」表示更改3个字
跳至指定的行
「ctrl」+「g」列出光标所在行的行号。
「#G」:例如,「15G」,表示移动光标至文章的第15行行首。
在使用「last line mode」之前,请记住先按「ESC」键确定您已经处于「command mode」下后,再按「:」冒号即可进入「last line mode」。
「set nu」:输入「set nu」后,会在文件中的每一行前面列出行号。
「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。
「/关键字」:先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。
「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。
「w」:在冒号输入字母「w」就可以将文件保存起来。
「q」:按「q」就是退出,如果无法离开vi,可以在「q」后跟一个「!」强制离开vi。
「qw」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件。
h ---左移光标一个字符 l ---右移光标一个字符 k ---光标上移一行 j ---光标下移一行 ^ ----光标移动至行首 0 ---数字"0",光标移至文章的开头 G ---光标移至文章的最后 $ ---光标移动至行尾 Ctrl+f ---向前翻屏 Ctrl+b ---向后翻屏 Ctrl+d ---向前翻半屏 Ctrl+u ---向后翻半屏 i ---在光标位置前插入字符 a ---在光标所在位置的后一个字符开始增加 o ---插入新的一行,从行首开始输入 ESC ---从输入状态退至命令状态 x ---删除光标后面的字符 #x ---删除光标后的#个字符 X ---(大写X),删除光标前面的字符 #X ---删除光标前面的#个字符 dd ---删除光标所在的行 #dd ---删除从光标所在行数的#行 yw ---复制光标所在位置的一个字 #yw ---复制光标所在位置的#个字 yy ---复制光标所在位置的一行 #yy ---复制从光标所在行数的#行 p ---粘贴 u ---取消操作 cw ---更改光标所在位置的一个字 #cw ---更改光标所在位置的#个字
w filename 储存正在编辑的文件为filename
wq filename 储存正在编辑的文件为filename,并退出vi
q! 放弃所有修改,退出vi
set nu 显示行号
/或? 查找,在/后输入要查找的内容
n 与/或?一起使用,如果查找的内容不是想要找的关键字,按n或向后(与/联用)或向前(与?联用)继续查找,直到找到为止。
对于第一次用vi,有几点注意要提醒一下:
1、用vi打开文件后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。切换方法:在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。
2、编辑好后,需从插入模式切换为命令行模式才能对文件进行保存,切换方法:按「ESC」键。
3、保存并退出文件:在命令模式下输入:wq即可!(别忘了wq前面的:) 如果这样无法退出:按住“shift”,连续按两次“z”。即“shift+z+z(z为小写)”
sed命令来自于英文词组“stream editor”的缩写,其功能是用于利用语法/脚本对文本文件进行批量的编辑操作。sed命令最初由贝尔实验室开发,后被众多Linux系统接纳集成,能够通过正则表达式对文件进行批量编辑,让需要重复的工作不再浪费时间。
与vim的区别是:Vim 采用的是交互式文本编辑模式,你可以用键盘命令来交互性地插入、删除或替换数据中的文本。但本节要讲的 sed 命令不同,它采用的是流编辑模式,最明显的特点是,在 sed 处理数据之前,需要预先提供一组规则,sed 会按照此规则来编辑数据。
sed 会根据脚本命令来处理文本文件中的数据,这些命令要么从命令行中输入,要么存储在一个文本文件中,此命令执行数据的顺序如下:
sed 参数 ‘脚本命令’ 文件名 其中: - 动作使用单引号 - 文件可以选填,如果无文件项,需要与其他指令组合使用,例如nl,cat等 常用参数: -e或--expression=<script> 该选项会将其后跟的脚本命令添加到已有的命令中,一次指定多个-e来执行多次命令 -f<script文件>或--file=<script文件> 以指定的脚本文件来处理输入的文本文件 -h或--help 显示帮助 -n或--quiet或--silent 仅显示script处理后的结果,在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。 -V或--version 显示版本信息 -r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法) -i :直接修改源文件内容,而不是输出到终端。 -y : 按字符映射,[address]y/inchars/outchars/ , 对 inchars 和 outchars 值进行一对一的映射 脚本命令: [address]function [address]不见得会存在,一般代表『选择进行动作的行数』 function: a :新增, a 的后面可以接字串,而这些字符串会在新的一行出现(目前的下一行)~ c :取代整行, c 的后面可以接字串,这些字符串可以取代 n1,n2 之间的行! d :删除,因为是删除,所以 d 后面通常不接任何字符串;如果不指定具体行数,会全部删除 i :插入, i 的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行); p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~ s :替换,可以直接进行替换的工作,通常这个 s 的动作可以搭配正规表示法,例如 1,20s/old/new/g g : (GLOBAL)是全部替换,不加g 是只替换第一次出现的字符 q : 退出 正则表达式规则: ^ 行开头 \s空格 $ 行尾
对各个脚本命令来说,address 用来表明该脚本命令作用到文本中的具体行。
默认情况下,sed 命令会作用于文本数据的所有行。如果只想将命令作用于特定行或某些行,则必须写明 address 部分,表示的方法有以下 2 种:
[address]脚本命令
address {
多个脚本命令
}
#sed '2s/dog/cat/' data1.txt
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy cat
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
# sed 只修改地址指定的第二行的文本。
下面的例子中使用了行地址区间:
# sed '2,3s/dog/cat/' data1.txt
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy cat
The quick brown fox jumps over the lazy cat
The quick brown fox jumps over the lazy dog
在此基础上,如果想将命令作用到文本中从某行开始的所有行,可以用特殊地址——美元符($):
# sed '2,$s/dog/cat/' data1.txt
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy cat
The quick brown fox jumps over the lazy cat
The quick brown fox jumps over the lazy cat
/pattern/command
注意,必须用正斜线将要指定的 pattern 封起来,sed 会将该命令作用到包含指定文本模式的行上。
举个例子,如果你想只修改用户 demo 的默认 shell,可以使用 sed 命令,执行命令如下:
# grep demo /etc/passwd
demo:x:502:502::/home/Samantha:/bin/bash
# sed '/demo/s/bash/csh/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
...
demo:x:502:502::/home/demo:/bin/csh
...
虽然使用固定文本模式能帮你过滤出特定的值,就跟上面这个用户名的例子一样,但其作用难免有限,因此,sed 允许在文本模式使用正则表达式指明作用的具体行。正则表达式允许创建高级文本模式匹配表达式来匹配各种数据。这些表达式结合了一系列通配符、特殊字符以及固定文本字符来生成能够匹配几乎任何形式文本的简练模式。
关于正则表达式,本节不做过多介绍,这里仅给读者提供一个简单示例:
[root@localhost ~]# cat test.txt <html> <title>First Wed</title> <body> h1Helloh1 h2Helloh2 h3Helloh3 </body> </html> #使用正则表示式给所有第一个的h1、h2、h3添加<>,给第二个h1、h2、h3添加</> [root@localhost ~]# cat sed.sh /h[0-9]/{ s//\<&\>/1 s//\<\/&\>/2 } [root@localhost ~]# sed -f sed.sh test.txt <h1>Hello</h1> <h2>Hello</h2> <h3>Hello</h3>
[address]s/pattern/replacement/flags
address 表示指定要操作的具体行,pattern 指的是需要替换的内容,replacement 指的是要替换的新内容。
flags:
n 1~512 之间的数字,表示指定要替换的字符串出现第几次时才进行替换,例如,一行中有 3 个 A,但用户只想替换第二个 A,这是就用到这个标记;
g 对数据中所有匹配到的内容进行替换,如果没有 g,则只会在第一次匹配成功时做替换操作。例如,一行数据中有 3 个 A,则只会替换第一个 A;
p 会打印与替换命令中指定的模式匹配的行。此标记通常与 -n 选项一起使用。
w file 将缓冲区中的内容写到指定的 file 文件中;
& 用正则表达式匹配的内容进行替换;
\n 匹配第 n 个子串,该子串之前在 pattern 中用 \(\) 指定。
\ 转义(转义替换部分包含:&、\ 等)。
示例:
sed 's/test/trial/2' data4.txt #使用trial替换data4.txt每行中,第二次出现的test
sed 's/test/trial/g' data4.txt #g替换所有出现的test
sed 's/test/trial/w test.txt' data5.txt #w将替换结果输出导test.txt
sed 'd' data1.txt #删除全部
sed '3d' data6.txt #删除第3行
sed '1,3d' data6.txt #删除第1、3行
sed '/1/,/3/d' data6.txt # 删除1至3行
sed '3,$d' data6.txt #删除3至末尾行
注意:在默认情况下 sed 并不会修改原始文件,这里被删除的行只是从 sed 的输出中消失了,原始文件没做任何改变。
a 命令表示在指定行的后面附加一行,i 命令表示在指定行的前面插入一行,这里之所以要同时介绍这 2 个脚本命令,因为它们的基本格式完全相同
sed '3i\
> This is an inserted line.' data6.txt #将一个新行插入到数据流第三行前
sed '3a\
> This is an appended line.' data6.txt #将一个新行附加到数据流中第三行后
sed '1i\
> This is one line of new text.\
> This is another line of new text.' data6.txt #将一个多行数据添加到数据流中,只需对要插入或附加的文本中的每一行末尾(除最后一行)添加反斜线即可
c 命令表示将指定行中的所有内容,替换成该选项后面的字符串。
sed '3c\
> This is a changed line of text.' data6.txt #替换第3行内容
sed '/number 3/c\
> This is a changed line of text.' data6.txt #功能同上
y 转换命令是唯一可以处理单个字符的 sed 脚本命令,其基本格式如下:
[address]y/inchars/outchars/
转换命令会对 inchars 和 outchars 值进行一对一的映射,即 inchars 中的第一个字符会被转换为 outchars 中的第一个字符,第二个字符会被转换成 outchars 中的第二个字符…这个映射过程会一直持续到处理完指定字符。如果 inchars 和 outchars 的长度不同,则 sed 会产生一条错误消息。
cat data8.txt #原文件内容
This is line number 1.
This is line number 2.
This is line number 3.
This is line number 4.
sed 'y/123/789/' data8.txt #-y替换后
This is line number 7.
This is line number 8.
This is line number 9.
This is line number 4.
#inchars 模式中指定字符的每个实例都会被替换成 outchars 模式中相同位置的那个字符。
转换命令是一个全局命令,也就是说,它会文本行中找到的所有指定字符自动进行转换,而不会考虑它们出现的位置,不同于-s替换(可以指定替换第几个)。
p 命令表示搜索符号条件的行,并输出该行的内容,常见的用法是打印包含匹配文本模式的行,例如:
[root@localhost ~]# cat data6.txt
This is line number 1.
This is line number 2.
This is line number 3.
This is line number 4.
[root@localhost ~]# sed -n '/number 3/p' data6.txt
This is line number 3.
可以看到,用 -n 选项和 p 命令配合使用,我们可以禁止输出其他行,只打印包含匹配文本模式的行。
如果需要在修改之前查看行,也可以使用打印命令,比如与替换或修改命令一起使用。可以创建一个脚本在修改行之前显示该行,如下所示:
[root@localhost ~]# sed -n '/3/{
> p
> s/line/test/p
> }' data6.txt
This is line number 3.
This is test number 3.
sed 命令会查找包含数字 3 的行,然后执行两条命令。首先,脚本用 p 命令来打印出原始行;然后它用 s 命令替换文本,并用 p 标记打印出替换结果。输出同时显示了原来的行文本和新的行文本。
w 命令用来将文本中指定行的内容写入文件中,此命令的基本格式如下:
[address]w filename
这里的 filename 表示文件名,可以使用相对路径或绝对路径,但不管是哪种,运行 sed 命令的用户都必须有文件的写权限。
下面的例子是将数据流中的前两行打印到一个文本文件中:
#sed '1,2w test.txt' data6.txt
This is line number 1.
This is line number 2.
This is line number 3.
This is line number 4.
# cat test.txt
This is line number 1.
This is line number 2.
当然,如果不想让行直接输出,可以用 -n 选项,再举个例子:
#cat data11.txt
Blum, R Browncoat
McGuiness, A Alliance
Bresnahan, C Browncoat
#sed -n '/Browncoat/w Browncoats.txt' data11.txt
cat Browncoats.txt
Blum, R Browncoat
Bresnahan, C Browncoat
可以看到,通过使用 w 脚本命令,sed 可以实现将包含文本模式的数据行写入目标文件。
r 命令用于将一个独立文件的数据插入到当前数据流的指定位置,该命令的基本格式为:
[address]r filename
sed 命令会将 filename 文件中的内容插入到 address 指定行的后面,比如说:
# cat data12.txt
This is an added line.
This is the second added line.
# sed '3r data12.txt' data6.txt
This is line number 1.
This is line number 2.
This is line number 3.
This is an added line.
This is the second added line.
This is line number 4.
如果你想将指定文件中的数据插入到数据流的末尾,可以使用 $ 地址符,例如:
# sed '$r data12.txt' data6.txt
This is line number 1.
This is line number 2.
This is line number 3.
This is line number 4.
This is an added line.
This is the second added line.
q 命令的作用是使 sed 命令在第一次匹配任务结束后,退出 sed 程序,不再进行对后续数据的处理。
# sed '2q' test.txt
This is line number 1.
This is line number 2.
可以看到,sed 命令在打印输出第 2 行之后,就停止了,是 q 命令造成的,再比如:
# sed '/number 1/{ s/number 1/number 0/;q; }' test.txt
This is line number 0.
使用 q 命令之后,sed 命令会在匹配到 number 1 时,将其替换成 number 0,然后直接退出。
在学习 sed 命令的基础功能时,你可能注意到了一个局限,即所有的 sed 命令都只是针对单行数据执行操作,在 sed 命令读取缓冲区中的文本数据时,它会基于换行符的位置,将数据分成行,sed 会根据定义好的脚本命令一次处理一行数据。
但是,有时我们需要对跨多行的数据执行特定操作。比如说,在文本中查找一串字符串"https://editor.csdn.net/md/?articleId=124843131",它很有可能出现在两行中,每行各包含其中一部分。这时,如果用普通的 sed 编辑器命令来处理文本,就不可能发现这种被分开的情况。
幸运的是,sed 命令的设计人员已经考虑到了这种情况,并设计了对应的解决方案。sed 包含了三个可用来处理多行文本的特殊命令,分别是:
注意,以上命令的缩写,都为大写。
N 命令会将下一行文本内容添加到缓冲区已有数据之后(之间用换行符分隔),从而使前后两个文本行同时位于缓冲区中,sed 命令会将这两行数据当成一行来处理。
下面这个例子演示的 N 命令的功能:
# cat data2.txt
This is the header line.
This is the first data line.
This is the second data line.
This is the last line.
# sed '/first/{ N ; s/\n/ / }' data2.txt
This is the header line.
This is the first data line. This is the second data line.
This is the last line.
在这个例子中,sed 命令查找含有单词 first 的那行文本。找到该行后,它会用 N 命令将下一行合并到那行,然后用替换命令 s 将换行符替换成空格。结果是,文本文件中的两行在 sed 的输出中成了一行。
如果要在数据文件中查找一个可能会分散在两行中的文本短语,如何实现呢?这里给大家一个实例:
# cat data3.txt
On Tuesday, the Linux System
Administrator's group meeting will be held.
All System Administrators should attend.
Thank you for your attendance.
# sed 'N ; s/System.Administrator/Desktop User/' data3.txt
On Tuesday, the Linux Desktop User's group meeting will be held.
All Desktop Users should attend.
Thank you for your attendance.
用 N 命令将发现第一个单词的那行和下一行合并后,即使短语内出现了换行,你仍然可以找到它,这是因为,替换命令在 System 和 Administrator之间用了通配符(.)来匹配空格和换行符这两种情况。但当它匹配了换行符时,它就从字符串中删掉了换行符,导致两行合并成一行。这可能不是你想要的。
要解决这个问题,可以在 sed 脚本中用两个替换命令,一个用来匹配短语出现在多行中的情况,一个用来匹配短语出现在单行中的情况,比如:
# sed 'N
> s/System\nAdministrator/Desktop\nUser/
> s/System Administrator/Desktop User/
> ' data3.txt
On Tuesday, the Linux Desktop
User's group meeting will be held.
All Desktop Users should attend.
Thank you for your attendance.
第一个替换命令专门查找两个单词间的换行符,并将它放在了替换字符串中。这样就能在第一个替换命令专门在两个检索词之间寻找换行符,并将其纳入替换字符串。这样就允许在新文本的同样位置添加换行符了。
但这个脚本中仍有个小问题,即它总是在执行 sed 命令前将下一行文本读入到缓冲区中,当它到了后一行文本时,就没有下一行可读了,此时 N 命令会叫 sed 程序停止,这就导致,如果要匹配的文本正好在最后一行中,sed 命令将不会发现要匹配的数据。
解决这个 bug 的方法是,将单行命令放到 N 命令前面,将多行命令放到 N 命令后面,像这样:
# sed '
> s/System\nAdministrator/Desktop\nUser/
> N
> s/System Administrator/Desktop User/
> ' data3.txt
On Tuesday, the Linux Desktop
User's group meeting will be held.
All Desktop Users should attend.
Thank you for your attendance.
现在,查找单行中短语的替换命令在数据流的后一行也能正常工作,多行替换命令则会负责短语出现在数据流中间的情况。
sed 不仅提供了单行删除命令(d),也提供了多行删除命令 D,其作用是只删除缓冲区中的第一行,也就是说,D 命令将缓冲区中第一个换行符(包括换行符)之前的内容删除掉。
比如说:
# cat data4.txt
On Tuesday, the Linux System
Administrator's group meeting will be held.
All System Administrators should attend.
# sed 'N ; /System\nAdministrator/D' data4.txt
Administrator's group meeting will be held.
All System Administrators should attend.
文本的第二行被 N 命令加到了缓冲区,因此 sed 命令第一次匹配就是成功,而 D 命令会将缓冲区中第一个换行符之前(也就是第一行)的数据删除,所以,得到了如上所示的结果。
下面的例子中,它会删除数据流中出现在第一行前的空白行:
# cat data5.txt
This is the header line.
This is a data line.
This is the last line.
# sed '/^$/{N ; /header/D}' data5.txt
This is the header line.
This is a data line.
This is the last line.
sed会查找空白行,然后用 N 命令来将下一文本行添加到缓冲区。此时如果缓冲区的内容中含有单词 header,则 D 命令会删除缓冲区中的第一行。
同 d 和 D 之间的区别一样,P(大写)命令和单行打印命令 p(小写)不同,对于具有多行数据的缓冲区来说,它只会打印缓冲区中的第一行,也就是首个换行符之前的所有内容。
例如,test.txt 文件中的内容如下:
# cat test.txt
aaa
bbb
ccc
ddd
eee
fff
P(大写)命令 p(小写)命令输出对比:
# sed '/.*/N;P' aaa aaa bbb ccc ccc ddd eee eee fff # sed '/.*/N;p' aaa bbb aaa bbb ccc ddd ccc ddd eee fff eee fff
第一个 sed 命令,每次都使用 N 将下一行内容追加到缓冲区内容的后面(用换行符间隔),也就是说,第一次时缓冲区中的内容为 aaa\nbbb,但 P(大写) 命令的作用的打印换行符之前的内容,也就是 aaa,之后则是 sed 在自动输出功能输出 aaa 和 bbb(sed 命令会自动将 \n 输出为换行),第一次时缓冲区中的内容为 bbb\nccc,依次类推,就输出了所看到的结果。
第二个 sed 命令,使用的是 p (小写)单行打印命令,它会将缓冲区中的所有内容全部打印出来(\n 会自动输出为换行),因此,出现了看到的结果。
前面我们一直说,sed 命令处理的是缓冲区中的内容,其实这里的缓冲区,应称为模式空间。值得一提的是,模式空间并不是 sed 命令保存文件的唯一空间。sed 还有另一块称为保持空间的缓冲区域,它可以用来临时存储一些数据。
sed 保持空间命令
h 将模式空间中的内容复制到保持空间
H 将模式空间中的内容附加到保持空间
g 将保持空间中的内容复制到模式空间
G 将保持空间中的内容附加到模式空间
x 交换模式空间和保持空间中的内容
通常,在使用 h 或 H 命令将字符串移动到保持空间后,最终还要用 g、G 或 x 命令将保存的字符串移回模式空间。保持空间最直接的作用是,一旦我们将模式空间中所有的文件复制到保持空间中,就可以清空模式空间来加载其他要处理的文本内容。
由于有两个缓冲区域,下面的例子中演示了如何用 h 和 g 命令来将数据在 sed 缓冲区之间移动。
# cat data2.txt
This is the header line.
This is the first data line.
This is the second data line.
This is the last line.
# sed -n '/first/ {h ; p ; n ; p ; g ; p }' data2.txt
This is the first data line.
This is the second data line.
This is the first data line.
这个例子的运行过程是这样的:
sed脚本命令用正则表达式过滤出含有单词first的行;
当含有单词 first 的行出现时,h 命令将该行放到保持空间;
p 命令打印模式空间也就是第一个数据行的内容;
n 命令提取数据流中的下一行(This is the second data line),并将它放到模式空间;
p 命令打印模式空间的内容,现在是第二个数据行;
g 命令将保持空间的内容(This is the first data line)放回模式空间,替换当前文本;
p 命令打印模式空间的当前内容,现在变回第一个数据行了。
通常,sed 程序的执行过程会从第一个脚本命令开始,一直执行到最后一个脚本命令(D 命令是个例外,它会强制 sed 返回到脚本的顶部,而不读取新的行)。sed 提供了 b 分支命令来改变命令脚本的执行流程,其结果与结构化编程类似。
b 分支命令基本格式为:
[address]b [label]
其中,address 参数决定了哪些行的数据会触发分支命令,label 参数定义了要跳转到的位置。
注意:如果没有加 label 参数,跳转命令会跳转到脚本的结尾,比如:
# cat data2.txt
This is the header line.
This is the first data line.
This is the second data line.
This is the last line.
# sed '{2,3b ; s/This is/Is this/ ; s/line./test?/}' data2.txt
Is this the header test?
This is the first data line.
This is the second data line.
Is this the last test?
可以看到,因为 b 命令未指定 label 参数,因此数据流中的第2行和第3行并没有执行那两个替换命令。
如果我们不想直接跳到脚本的结尾,可以为 b 命令指定一个标签(也就是格式中的 label,最多为 7 个字符长度)。在使用此该标签时,要以冒号开始(比如 :label2),并将其放到要跳过的脚本命令之后。这样,当 sed 命令匹配并处理该行文本时,会跳过标签之前所有的脚本命令,但会执行标签之后的脚本命令。
# sed '{/first/b jump1 ; s/This is the/No jump on/
> :jump1
> s/This is the/Jump here on/}' data2.txt
No jump on header line
Jump here on first data line
No jump on second data line
No jump on last line
在这个例子中,如果文本行中出现了 first,程序的执行会直接跳到 jump1 标签之后的脚本行。如果分支命令的模式没有匹配,sed 会继续执行所有的脚本命令。
b 分支命令除了可以向后跳转,还可以向前跳转,例如:
# echo "This, is, a, test, to, remove, commas." | sed -n '{
> :start
> s/,/ /1p
> /,/b start
> }'
This is, a, test, to, remove, commas.
This is a, test, to, remove, commas.
This is a test, to, remove, commas.
This is a test to, remove, commas.
This is a test to remove, commas.
This is a test to remove commas.
在这个例子中,当缓冲区中的行内容中有逗号时,脚本命令就会一直循环执行,每次迭代都会删除文本中的第一个逗号,并打印字符串,直至内容中没有逗号。
类似于 b 分支命令,t 命令也可以用来改变 sed 脚本的执行流程。t 测试命令会根据 s 替换命令的结果,如果匹配并替换成功,则脚本的执行会跳转到指定的标签;反之,t 命令无效。
测试命令使用与分支命令相同的格式:
[address]t [label]
跟分支命令一样,在没有指定标签的情况下,如果 s 命令替换成功,sed 会跳转到脚本的结尾(相当于不执行任何脚本命令)。例如:
# sed '{
> s/first/matched/
> t
> s/This is the/No match on/
> }' data2.txt
No match on header line
This is the matched data line
No match on second data line
No match on last line
此例中,第一个替换命令会查找模式文本 first,如果匹配并替换成功,命令会直接跳过后面的替换命令;反之,如果第一个替换命令未能匹配成功,第二个替换命令就会被执行。
再举个例子:
# echo "This, is, a, test, to, remove, commas. " | sed -n '{
> :start
> s/,/ /1p
> t start
> }'
This is, a, test, to, remove, commas.
This is a, test, to, remove, commas.
This is a test, to, remove, commas.
This is a test to, remove, commas.
This is a test to remove, commas.
This is a test to remove commas.
mtime – last modification time 文件内容修改时间
ctime – last change time 这里不是createtime,是变动时间,例如文件内容、文件权限权限等的变更时间
atime – last access time 上次被访问时间
crtime– create time 文件创建时间
cat命令来自于英文单词concatenate的缩写,其功能是用于查看文件内容。在Linux系统中有很多用于查看文件内容的命令,例如more、tail、head……等等,每个命令都有各自的特点。cat命令适合查看内容较少的、纯文本的文件。
对于内容较多的文件,使用cat命令查看后会在屏幕上快速滚屏,用户往往看不清所显示的具体内容,只好按Ctrl+c键中断命令的执行,所以对于大文件,干脆用more命令吧~
cat [选项] 文件名 ///查看文件内容 cat [选项] 文件一 文件二> 文件三 #合并文件 选项: -n 显示行数(空行也编号) -s 显示行数(多个空行算一个编号) -b 显示行数(空行不编号) -E 每行结束处显示$符号 -T 将TAB字符显示为 ^I符号 -v 使用 ^ 和 M- 引用,除了 LFD 和 TAB 之外 -e 等价于”-vE”组合 -t 等价于”-vT”组合 -A 等价于 -vET组合 --help 显示帮助信息 --version 显示版本信息 > 输出重定向符,写入内容 << 结束输入
示例: 1. cat anaconda-ks.cfg #查看anaconda-ks.cfg文件的内容 #version=RHEL8 ignoredisk --only-use=sda autopart --type=lvm # Partition clearing information ………………省略部分输出信息……………… 2. cat -n anaconda-ks.cfg #查看某个文件的内容,并显示行号 cat -n anaconda-ks.cfg 1 #version=RHEL8 2 ignoredisk --only-use=sda 3 autopart --type=lvm 4 # Partition clearing information 5 clearpart --none --initlabel 6 # Use graphical install ………………省略部分输出信息……………… 3. # cat /dev/null > anaconda-ks.cfg # cat anaconda-ks.cfg #搭配空设备文件和输出重定向操作符,将某个文件内容清空,此时 anaconda-ks.cfg内容为空 4. # cat > anaconda-ks.cfg << EOF #持续写入文件内容,直到碰到EOF符后才会结束并保存: > Hello,World > Linux!~ > EOF # cat anaconda-ks.cfg Hello,World Linux!~ 5. # cat /dev/cdrom > rhel.iso # 搭配输出重定向操作符,将光盘设备制作成镜像文件 # ls rhel.iso -lh -rw-r--r--. 1 root root 6.7G May 2 00:43 rhel.iso # file rhel.iso rhel.iso: DOS/MBR boot sector; partition 2 : ID=0xef, start-CHS (0x3ff,254,63), end-CHS (0x3ff,254,63), startsector 23128, 19888 sectors
head [选型] 文件名 #head 命令默认查看前10行内容
- n 指定查看n行
- head -n 15 passwd
tail命令的功能是用于查看文件尾部内容,例如默认会在终端界面上显示出指定文件的末尾十行,如果指定了多个文件,则会在显示的每个文件内容前面加上文件名来加以区分。
高阶玩法的-f参数作用是持续显示文件的尾部最新内容,类似于机场候机厅的大屏幕,总会把最新的消息展示给用户,对阅读日志文件尤为适合,而不需要手动刷新。
tail [参数] 文件
常用参数:
-c <N> 输出文件尾部的N(N为整数)个字节内容
-f 持续显示文件最新追加的内容
-F <N> 与选项“-follow=name”和“--retry”连用时功能相同
-n <N> 输出文件的尾部N(N位数字)行内容
--retry 即是在tail命令启动时,文件不可访问或者文件稍后变得不可访问,都始终尝试打开文件。
--pid=<进程号> 与“-f”选项连用,当指定的进程号的进程终止后,自动退出tail命令
--help 显示指令的帮助信息
--version 显示指令的版本信息
参考实例: 1. 默认显示某个文件尾部的后10行内容: # tail initial-setup-ks.cfg %addon com_redhat_subscription_manager %end %addon ADDON_placeholder --disable --reserve-mb=auto %end %anaconda --------------------省略内容-------------------- 2. 指定显示某个文件尾部的后5行内容: # tail -n 5 initial-setup-ks.cfg %anaconda pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty %end 3. 指定显示某个文件尾部的后15个字节: # tail -c 30 initial-setup-ks.cfg t --nochanges --notempty %end 4. 持续刷新显示某个文件尾部的后10行内容: # tail -f /var/log/messages ………………省略输出信息………………
echo是用于在终端设备上输出指定字符串或变量提取后值的命令,能够给用户一些简单的提醒信息,也可以将输出的指定字符串内容同管道符一起传递给后续命令作为标准输入信息再来进行二次处理,又或者同输出重定向符一起操作,将信息直接写入到文件中。
如需提取变量值,需在变量名称前加入$符号做提取,变量名称一般均为大写形式。
echo [参数] 字符串/变量
参数:
-n 不输出结尾的换行符
-e “\a” 发出警告音
-e “\b” 删除前面的一个字符
-e “\c” 结尾不加换行符
-e “\f” 换行,光标扔停留在原来的坐标位置
-e “\n” 换行,光标移至行首
-e “\r” 光标移至行首,但不换行
-E 禁止反斜杠转移,与-e参数功能相反
—version 查看版本信息
--help 查看帮助信息
示例: 1. # echo LinuxCool #输出指定字符串到终端设备界面(默认为电脑屏幕) LinuxCool 2. # echo $PATH #输出某个变量值内容 /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/root/bin 3. # echo \$PATH #搭配转义符一起使用,输出纯字符串内容 $PATH 4. # echo "Hello World" > Document #搭配输出重定向符一起使用,将字符串内容直接写入文件中 5. # echo `uptime` #搭配反引号执行命令,并将执行结果输出 16:16:12 up 52 min, 1 user, load average: 0.00, 0.00, 0.00 6. # echo -e "First\nSecond\nThird" #输出带有换行符的内容 First Second Third 7. # echo -e "123\b456" #指定删除字符串中某些字符,随后将内容输出 12456
awk命令来自于三位创始人”Alfred Aho,Peter Weinberger, Brian Kernighan “的姓氏缩写,其功能是用于对文本和数据进行处理的编程语言。使用awk命令可以让用户自定义函数或正则表达式对文本内容进行高效管理,与sed、grep并称为Linux系统中的文本三剑客。
awk实际是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。
awk 命令可以用来过滤文本,简单理解就是对文本的每行执行命令awk指定的脚本,逐行扫描文件内容并执行脚本,用编程思想来理解的话,实际上就是以文本每行内容为循环条件的循环语句。它的基本命令格式如下:
awk 参数 'BEGIN{ commands } pattern{ commands } END{ commands }' file 其中: 'BEGIN{ commands } 指定最开始执行的脚本,在awk开始从输入输出流中读取行之前执行,在BEGIN语句块中执行如变量初始化,打印输出表头等操作。 pattern{ commands } 对文件的每一行遍历,判断是否满足pattern的模式,如果满足则执行脚本,,默认脚本是print输出 END{ commands } 指定最后执行的脚本,所有的输入读取完成后执行。 // 一个awk脚本通常由BEGIN,pattern语句块,END语句块组成,三部分都是可选的。 // 脚本通常是被单引号或双引号包住。 file 需要读取的文本 参数: -F <fs>指定输入时用到的字段分隔符,默认为空格,fs可以是字符串或正则表达式 -v <var=value> 自定义变量,可以接受外部变量 -f 从脚本中读取awk命令 -m 对val值设置内在限制 内置变量(可以在脚本中调用): $n : 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。使用此变量,通常要指定-F字段分隔符, $0 : 这个变量包含执行过程中当前行的文本内容。 ARGC : 命令行参数的数目。 ARGIND : 命令行中当前文件的位置(从0开始算)。 ARGV : 包含命令行参数的数组。 CONVFMT : 数字转换格式(默认值为%.6g)。 ENVIRON : 环境变量关联数组。 ERRNO : 最后一个系统错误的描述。 FIELDWIDTHS : 字段宽度列表(用空格键分隔)。 FILENAME : 当前输入文件的名。 NR : 表示记录数,在执行过程中对应于当前的行号 FNR : 同NR :,但相对于当前文件。 FS : 字段分隔符(默认是任何空格),一般用于脚本文件,赋值此变量指定分隔符,命令行中使用-F 参数。 IGNORECASE : 如果为真,则进行忽略大小写的匹配。 NF : 表示字段数,在执行过程中对应于当前的字段数。 print $NF答应一行中最后一个字段 OFMT : 数字的输出格式(默认值是%.6g)。 OFS : 输出字段分隔符(默认值是一个空格)。 ORS : 输出记录分隔符(默认值是一个换行符)。 RS : 记录分隔符(默认是一个换行符)。 RSTART : 由match函数所匹配的字符串的第一个位置。 RLENGTH : 由match函数所匹配的字符串的长度。 SUBSEP : 数组下标分隔符(默认值是34)
这里是最常用的几个操作例子:
打印“开始”,打印每行,打印“结束”: awk ‘BEGIN{ print “开始” } { print } END{ print “结束” }’ 1.txt
打印每行的行号:awk ‘{print NR}’ 1.txt
打印每行的文本:awk ‘{print $0}’ 1.txt
打印每行的第1列(默认用空格分离):awk ‘{print $1}’ 1.txt
打印每行的最后1列(默认用空格分离):awk ‘{print $NF}’ 1.txt
打印每行的倒数第2列(默认用空格分离):awk ‘{print $(NF-1)}’ 1.txt
打印每行,并为每行带上行号:awk ‘{print NR":",$0}’ 1.txt
打印含有序号的行:awk ‘/\d./ {print}’ 1.txt
1. 借助 -v 选项,可以将来自外部值(非stdin)传递给awk
VAR=10000
echo | awk -v VARIABLE=$VAR '{ print VARIABLE }'
2. 定义内部变量接收外部变量
var1="aaa"
var2="bbb"
echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2
3. 当输入来自文件时
awk '{ print v1,v2 }' v1=$var1 v2=$var2 filename
awk 'BEGIN{a="100testa";if(a ~ /^100*/){print "ok";}}'
ok
while循环
while(表达式)
{语句}
do…while循环
do
{语句} while(条件)
其他相关语句
break:退出程序循环,也可以单独使用,在循环逐行匹配,如果遇到next,就会跳过当前行,直接忽略下面语句。而进行下一行匹配。next语句一般用于多行合并:
awk 'NR%2==1{next}{print NR,$0;}' text.txt
// 说明:当记录行号除以2余1,就跳过当前行。
// 下面的print NR,$0也不会执行。
// 下一行开始,程序又开始判断NR%2值。
// 这个时候记录行号是偶数,就会执行下面语句块print NR,$0;
continue: 进入下一次循环
next:读取下一个输入行
exit:退出主输入循环,进入END,若没有END或END中有exit语句,则退出脚本。
打开文件 open(“filename”)
关闭文件 close(“filename”)
输出到文件 重定向到文件,如echo | awk ‘{printf(“hello word!n”) > “datafile”}
awk getline用法:输出重定向需用到getline函数。getline从标准输入、管道或者当前正在处理的文件之外的其他输入文件获得输入。它负责从输入获得下一行的内容,并给NF,NR和FNR等内建变量赋值。如果得到一条记录,getline函数返回1,如果到达文件的末尾就返回0,如果出现错误,例如打开文件失败,就返回-1。
语法格式:getline var 变量var包含了特定行的内容
用法说明:
当其左右无重定向符时|,<时:getline作用于当前文件,读入当前文件的第一行给其后跟的变量var或$0(无变量),应该注意到,由于awk在处理getline之前已经读入了一行,所以getline得到的返回结果是隔行的。
当其左右有重定向符时|,<时:getline则作用于定向输入文件,由于该文件是刚打开,并没有被awk读入一行,只是getline读入,那么getline返回的是该文件的第一行,而不是隔行。
ls是最常被使用到的Linux命令之一,来自于英文单词list的缩写,也正如list单词的英文意思,其功能是列举出指定目录下的文件名称及其属性。
默认不加参数的情况下,ls命令会列出当前工作目录中的文件信息,经常与cd和pwd命令搭配使用,十分方便。而带上参数后,我们则可以做更多的事情,作为最基础、最频繁使用的命令,有必要仔细了解下其常用功能。
ls [参数] [文件]
常用参数:
-a 显示所有文件及目录 (包括以“.”开头的隐藏文件)
-l 使用长格式列出文件及目录的详细信息
-r 将文件以相反次序显示(默认依英文字母次序)
-t 根据最后的修改时间排序
-A 同 -a ,但不列出 “.” (当前目录) 及 “..” (父目录)
-S 根据文件大小排序
-R 递归列出所有子目录
-d 查看目录的信息,而不是里面子文件的信息
-i 输出文件的inode节点信息
-m 水平列出文件,以逗号间隔
-X 按文件扩展名排序
--color 输出信息中带有着色效果
参考实例: 1.输出当前目录中的文件(默认不含隐藏文件): # ls anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures Templates Desktop Downloads Music Public Videos 2. 输出当前目录中的文件(含隐藏文件): # ls -a . .bashrc Documents Music Videos .. .cache Downloads Pictures .viminfo anaconda-ks.cfg .config .esd_auth .pki .bash_history .cshrc .ICEauthority Public .bash_logout .dbus initial-setup-ks.cfg .tcshrc .bash_profile Desktop .local Templates 3. 输出文件的长格式,包含属性详情信息: # ls -l total 8 -rw-------. 1 root root 1430 Dec 14 08:05 anaconda-ks.cfg drwxr-xr-x. 2 root root 6 Dec 14 08:37 Desktop drwxr-xr-x. 2 root root 6 Dec 14 08:37 Documents drwxr-xr-x. 2 root root 6 Dec 14 08:37 Downloads -rw-r--r--. 1 root root 1585 Dec 14 08:34 initial-setup-ks.cfg drwxr-xr-x. 2 root root 6 Dec 14 08:37 Music drwxr-xr-x. 2 root root 6 Dec 14 08:37 Pictures drwxr-xr-x. 2 root root 6 Dec 14 08:37 Public drwxr-xr-x. 2 root root 6 Dec 14 08:37 Templates drwxr-xr-x. 2 root root 6 Dec 14 08:37 Videos 4. 输出指定目录中的文件列表: # ls /etc adjtime hosts pulse aliases hosts.allow qemu-ga alsa hosts.deny qemu-kvm alternatives hp radvd.conf anacrontab idmapd.conf ras asound.conf init.d rc0.d at.deny inittab rc1.d ………………省略部分输出信息……………… 5. 输出文件名称及inode属性块号码: # ls -i 35290115 anaconda-ks.cfg 35290137 initial-setup-ks.cfg 35290164 Templates 1137391 Desktop 17840039 Music 51609597 Videos 1137392 Documents 35290165 Pictures 17840038 Downloads 51609596 Public 6. 搭配通配符一起使用,输出指定目录中所有以sd开头的文件名称: # ls /dev/sd* /dev/sda /dev/sda1 /dev/sda2 7. 依据文件大小进行排序,输出指定目录中文件属性详情信息: # ls -Sl /etc total 1348 -rw-r--r--. 1 root root 692241 Sep 10 2018 services -rw-r--r--. 1 root root 66482 Dec 14 08:34 ld.so.cache -rw-r--r--. 1 root root 60352 May 11 2017 mime.types -rw-r--r--. 1 root dnsmasq 26843 Aug 12 2018 dnsmasq.conf -rw-r--r--. 1 root root 25696 Dec 12 2018 brltty.conf -rw-r--r--. 1 root root 9450 Aug 12 2018 nanorc -rw-r--r--. 1 root root 7265 Dec 14 08:03 kdump.conf -rw-------. 1 tss tss 7046 Aug 13 2018 tcsd.conf ………………省略部分输出信息………………
此命令在第五章介绍,
地址
linux 下查找文件的方法可以归类为4种(并不一定严格准确,仅作为参考):
find命令的功能是根据给定的路径和条件查找相关文件或目录,可以使用的参数很多,并且支持正则表达式,结合管道符后能够实现更加复杂的功能,是系统管理员和普通用户日常工作必须掌握的命令之一。
find命令通常进行的是从根目录(/)开始的全盘搜索,有别于whereis、which、locate……等等的有条件或部分文件的搜索。对于服务器负载较高的情况,建议不要在高峰时期使用find命令的模糊搜索,会相对消耗较多的系统资源。
find [路径] [参数] 常用参数: -name 匹配名称 -i 不区分大小写 -perm 匹配权限(mode为完全匹配,-mode为包含即可) -user 匹配所有者 -group 匹配所有组 -mtime -n +n 匹配修改内容的时间(-n指n天以内,+n指n天以前) -atime -n +n 匹配访问文件的时间(-n指n天以内,+n指n天以前) -ctime -n +n 匹配修改文件权限的时间(-n指n天以内,+n指n天以前) -nouser 匹配无所有者的文件 -nogroup 匹配无所有组的文件 -newer f1 !f2 匹配比文件f1新但比f2旧的文件 -type b/d/c/p/l/f 匹配文件类型(后面的字幕字母依次表示块设备、目录、字符设备、管道、链接文件、文本文件) -size 匹配文件的大小(+50KB为查找超过50KB的文件,而-50KB为查找小于50KB的文件) -prune 忽略某个目录 -exec …… {}\; 后面可跟用于进一步处理搜索结果的命令
参考实例 1. 全盘搜索系统中所有以.conf结尾的文件: # find / -name *.conf /run/tmpfiles.d/kmod.conf /etc/resolv.conf /etc/dnf/dnf.conf /etc/dnf/plugins/copr.conf /etc/dnf/plugins/debuginfo-install.conf /etc/dnf/plugins/product-id.conf /etc/dnf/plugins/subscription-manager.conf ………………省略部分输出信息……………… 2. 在/etc目录中搜索所有大约1M大小的文件: # find /etc -size +1M /etc/selinux/targeted/policy/policy.31 /etc/udev/hwdb.bin 3. 在/home目录中搜索所有属于指定用户的文件: # find /home -user linuxprobe /home/linuxprobe /home/linuxprobe/.mozilla /home/linuxprobe/.mozilla/extensions /home/linuxprobe/.mozilla/plugins /home/linuxprobe/.bash_logout /home/linuxprobe/.bash_profile /home/linuxprobe/.bashrc 4. 列出当前工作目录中的所有文件、目录以及子文件信息: # find . . ./.bash_logout ./.bash_profile ./.bashrc ./.cshrc ./.tcshrc ./anaconda-ks.cfg ………………省略部分输出信息……………… 5. 在/var/log目录下搜索所有指定后缀的文件,后缀不需要大小写。 # find /var/log -iname "*.log" /var/log/audit/audit.log /var/log/rhsm/rhsmcertd.log /var/log/rhsm/rhsm.log /var/log/sssd/sssd.log /var/log/sssd/sssd_implicit_files.log /var/log/sssd/sssd_nss.log /var/log/sssd/sssd_kcm.log /var/log/tuned/tuned.log /var/log/anaconda/anaconda.log /var/log/anaconda/X.log ………………省略部分输出信息……………… 6. 在/var/log目录下搜索所有后缀不是.log的文件: # find /var/log ! -name "*.log" /var/log /var/log/lastlog /var/log/README /var/log/private /var/log/wtmp /var/log/btmp /var/log/samba 7. 搜索当前工作目录中的所有近7天被修改过的文件: # find . -mtime +7 ./.bash_logout ./.bash_profile ./.bashrc ./.cshrc ./.tcshrc ………………省略部分输出信息……………… 8. 全盘搜索系统中所有类型为目录,且权限为1777的目录文件: # find / -type d -perm 1777 /dev/mqueue /dev/shm /var/tmp /tmp ………………省略部分输出信息……………… 9. 全盘搜索系统中所有类型为普通文件,且可以执行的文件信息: # find / -type f -perm /a=x /boot/vmlinuz-4.18.0-80.el8.x86_64 /boot/vmlinuz-0-rescue-c8b04558503242459d908c6c22a2d481 /etc/X11/xinit/xinitrc.d/50-systemd-user.sh /etc/X11/xinit/xinitrc.d/00-start-message-bus.sh /etc/X11/xinit/xinitrc.d/localuser.sh /etc/X11/xinit/Xclients /etc/X11/xinit/Xsession /etc/X11/xinit/xinitrc ………………省略部分输出信息……………… 10. 全盘搜索系统中所有后缀为.mp4的文件,并删除所有查找到的文件: # find / -name "*.mp4" -exec rm -rf {} \;
它实际上是指一个数据库(由updatedb编写)来查找用户正在查找的内容,并根据该搜索生成其输出。查找的是数据库文件,缺点是刚刚创建的文件,不会被搜索到。如果想使刚创建的文件被 locate 命令搜索到 , 可以使用sudo updatedb 命令 更新数据库, 否则要等到第二天才能搜索到该文件 , 该后台数据库默认一天更新一次 ;
local 文件名
local /m #查找没开头的文件
local -S # 查看数据库信息
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep来自于英文词组“global search regular expression and print out the line”的缩写,意思是用于全面搜索的正则表达式,并将结果输出。人们通常会将grep命令与正则表达式搭配使用,参数作为搜索过程中的补充或对输出结果的筛选,命令模式十分灵活。
与之容易混淆的是egrep命令和fgrep命令。如果把grep命令当作是标准搜索命令,那么egrep则是扩展搜索命令,等价于“grep -E”命令,支持扩展的正则表达式。而fgrep则是快速搜索命令,等价于“grep -F”命令,不支持正则表达式,直接按照字符串内容进行匹配。
grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...] 选项: -i 忽略大小写 -c 只输出匹配行的数量 -l 只列出符合匹配的文件名,不列出具体的匹配行 -n 列出所有的匹配行,显示行号 -h 查询多文件时不显示文件名 -s 不显示不存在、没有匹配文本的错误信息 -v 显示不包含匹配文本的所有行 -w 匹配整词 -x 匹配整行,只有整行内容与匹配词一样才显示 -r 递归搜索,显示文件所在目录即路径 -d skip :忽略子目录。 -q 禁止输出任何结果,以退出状态表示搜索是否成功 -b 打印匹配行距文件头部的偏移量,以字节为单位 -o 只打印匹配行的匹配部分,每个这样的部分在单独的输出行上。与-b结合使用,打印匹配的词据文件头部的偏移量,以字节为单位 -e exp : 指定该选项的表达式,可以多次使用,即一条指令中包含很多个-e -f file :指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。 -F 匹配固定字符串的内容 -E 支持扩展的正则表达式 -A n : 除了显示符合范本样式的那一行之外,并显示该行之后n行。 -B n : 除了显示符合范本样式的那一行之外,并显示该行之前n行。 -C n : 除了显示符合范本样式的那一行之外,并显示该行之前以及之后n行。 正则表达式特殊字符: \ :忽略正则表达式中特殊字符的原有含义。 [ ]:单个字符,如[A]即A符合要求。 [ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求。 .:所有的单个字符。 *:所有字符,长度任意也可以为0。 ^ 匹配以字符串开头的行 $匹配以字符串结尾的行,空行就只是一个$符号
示例:
grep stdio ./* #在当前目录下查找文件中包含stdio 字符的文件
grep stdClass New* #查找文件中内容有StdClass 并且New开头的文件
grep root /etc/passwd # 查找/etc/passwd 文件,包含root
grep ^root /etc/passwd # 查找/etc/passwd 文件,包含root开头
grep linuxprobe /etc/passwd /etc/shadow #搜索/etc/passwd /etc/shadow多个文件,包含关键词linuxprobe
grep -h linuxprobe /etc/passwd /etc/shadow #搜索/etc/passwd /etc/shadow多个文件,包含关键词linuxprobe你但是不显示文件名称
grep -c root /etc/passwd /etc/shadow #搜索/etc/passwd /etc/shadow多个文件,包含关键词root行的数量
grep -n network anaconda-ks.cfg #搜索anaconda-ks.cfg文件中,包含关键词network位置的行号及内容
grep -v nologin /etc/passwd #搜索/etc/passwd文件中,不包含nologin的文件(针对目录)/内容(针对文件)
cp [选项] 文件或目录 选项: -a或–archive 此参数的效果和同时指定”-dpR”参数相同。 -b或–backup 删除,覆盖目标文件之前的备份,备份文件会在字尾加上一个备份字符串。 -d或–no-dereference 当复制符号连接时,把目标文件或目录也建立为符号连接,并指向与源文件或目录连接的原始文件或目录。 -f或–force 强行复制文件或目录,不论目标文件或目录是否已存在。 -i或–interactive 覆盖既有文件之前先询问用户。 -l或–link 对源文件建立硬连接,而非复制文件。 -p或–preserve 保留源文件或目录的属性。 -P或–parents 保留源文件或目录的路径。 -r 递归处理,将指定目录下的文件与子目录一并处理。 -R或–recursive 递归处理,将指定目录下的所有文件与子目录一并处理。 -s或–symbolic-link 对源文件建立符号连接,而非复制文件。 -S<备份字尾字符串>或–suffix=<备份字尾字符串> 用”-b”参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,预设的备份字尾字符串是符号”~”。 -u或–update 使用这项参数后只会在源文件的更改时间较目标文件更新时或是 名称相互对应的目标文件并不存在,才复制文件。 -v或–verbose 显示指令执行过程。 -V<备份方式>或–version-control=<备份方式> 用”-b”参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,这字符串不仅可用”-S”参数变更,当使用”-V”参数指定不同备份方式时,也会产生不同字尾的备份字串。 -x或–one-file-system 复制的文件或目录存放的文件系统,必须与cp指令执行时所处的文件系统相同,否则不予复制。 –help 在线帮助。 –sparse=<使用时机> 设置保存稀疏文件的时机。 –version 显示版本信息。
[root@nginx01 ~]# cp /etc/passwd /data/
[root@nginx01 ~]# ll /data/
总用量 4
drwxr-xr-x 2 root root 6 1月 23 21:00 haha
-rw-r--r-- 1 root root 1077 1月 23 21:08 passwd
scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的
scp [选项] 文件名 目标地址
选项:
-r # 递归复制目录
-p#保留原文件的修改时间,访问时间和访问权限
-P port #指定目标端口
使用案例:
本地机器:192.168.1.2
远程机器:192.168.1.3
[root@nginx01 ~]# scp /tmp/local.txt root@192.168.1.3:/root
输入密码即可
[root@nginx01 ~]# scp root@192.168.1.3:/tmp/remote.txt /root
输入密码即可
2.以下方式适用于要复制目录
-2.1.将本地机器/tmp目录 复制到远程服务器的/root目录下
[root@nginx01 ~]# scp -r /tmp root@192.168.1.3:/root
输入密码即可
[root@nginx01 ~]# scp -rp /tmp root@192.168.1.3:/root
注意:远程复制目录一般更推荐采用打包然后复制的方式
3.以下方式适用于对方服务器端口不是22的情况(这里端口指的是ssh端口)
3.1将本地机器/tmp/local.txt复制到远程服务器(端口为63225)的/root目录下
[root@nginx01 ~]# scp -P 63225 /tmp/local.txt root@192.168.1.3:/root
实现两端主机的文件同步(rsync软件很强大,这里我们只是介绍其文件复制功能)。
rsync可以实现增量复制(适用于多个文件的场景),所以我们这里只是介绍目录同步。
[root@nginx01 ~]# yum install rsync -y
rsync [选项] 本地文件 目标地址
选项:
-a --archive : 归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。
-z : 传输时进行压缩提高效率。
-p --perms: 保持perms属性(权限,不包括特殊权限)
-v : 显示详细信息
[root@nginx01 ~]# rsync -avzP /var/www/html/www.a.com root@192.168.1.3:/var/www/html
输入密码即可
在远程服务器难免会因为网络原因,导致复制中断,我们使用screen解决此类问题
[root@nginx01 ~]# yum install screen -y
[root@nginx01 ~]# screen
然后执行复制命令即可
[root@nginx01 ~]# ps -ef |grep scp |grep -v grep
[root@nginx01 ~]# ps -ef |grep rsync |grep -v grep
如果传输完成即没有结果输出
mv命令来为文件或目录改名或将文件由一个目录移入另一个目录中。该命令等同于DOS系统下的ren和move命令的组合。它的使用权限是所有用户
mv [选项] 源文件或目录 目标文件或目录
选项:
-b:如果目标文件存在,则覆盖前为其创建一个备份
-i:交互方式操作。如果mv操作将导致对已存在的目标文件的覆盖,此时系统询问是否重写,要求用户回答”y”或”n”,这样可以避免误覆盖文件。
-f:禁止交互操作。mv操作要覆盖某个已有的目标文件时不给任何指示,指定此参数后i参数将不再起作用。
说明:
当第二个参数类型是文件时,mv命令完成文件重命名,它将所给的源文件或目录重命名为给定的目标文件名。
当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv命令将各参数指定的源文件均移至目标目录中。在跨文件系统移动文件时,mv先拷贝,再将原有文件删除,而链至该文件的链接也将丢失。
[root@nginx01 ~]# ll /data/
总用量 4
drwxr-xr-x 2 root root 6 1月 23 21:00 haha
-rw-r--r-- 1 root root 1077 1月 23 21:08 passwd
[root@nginx01 ~]# mv /data/passwd /data/haha/
[root@nginx01 ~]# ll /data/
总用量 0
drwxr-xr-x 2 root root 20 1月 23 21:11 haha
[root@nginx01 ~]# ll /data/haha/
总用量 4
-rw-r--r-- 1 root root 1077 1月 23 21:08 passwd
路径,就是文件存放的位置,分为绝对路径与相对路径。
在Linux中,绝对路径是从 / (也被称为根目录)开始的,比如/usr、/etc/X11。如果一个路径是从/开始的,它一定是绝对路径,这样就好理解了。
[root@localhost ~]# cd /usr/share/doc/ 注:使用绝对路径进入doc目录
[root@localhost doc]# pwd 注:判断用户当前所处的位置
/usr/share/doc 注:位于/usr/share/doc
在Linux中相对路径的使用相对于绝对路径来说是比较复杂的,在Linux路径中经常会一些特殊符号, 这些符号是用来表示相对路径的。
。表示用户所处的当前目录(为清晰起见,使用句号代替英文字符点.)
。。表示上级目录(为清晰起见,使用句号代替英文字符点.)
~ 表示当前用户自己的home目录
~USER 表示用户名为USER的家目录,这里的USER是在/etc/passwd中存在的用户名
使用“…/”来表示上一级目录,“…/…/”表示上上级的目录,以此类推。
pwd命令来自于英文词组”print working directory“的缩写,其功能是用于显示当前工作目录的路径,即显示所在位置的绝对路径。
在实际工作中,我们经常会在不同目录之间进行切换,为了防止”迷路“,可以使用pwd命令快速查看当前所处的工作目录路径,方便开展后续工作。
pwd [参数]
常用参数:
-L 显示逻辑路径
参考实例:
查看当前工作目录路径:
# pwd
/root
Linux下有相当多的压缩命令,初学的我们开始总是摸不清头脑,我们知道在Linux下的后缀名是没有什么很特殊的意义的,不过,为了方便记忆,针对这些压缩命令所做出来的压缩文件,还是会有一些特殊的命名方式,Linux下常见的压缩文件有*.tar,*.tar.gz, *.tgz, *.zip, *.Z, *.bz2等。
区别:
*.tar 文件,只是单纯的打包文件,并未进行压缩。
*.tar.gz, *.tgz, *.gz, *.Z, *.bz2等,是压缩后的文件。
Linux不是按照文件名后缀识别类型,但是约定熟成使用固定的字符来区分文件类型。
-命令格式 tar [选项] 打包后文件名 打包目录 tar [选项] 需拆包文件 主选项(必须): -c, --create创建打包文件 -u,--更新文件。就是说,用新增的文件取代原备份文件,如果在备份文件中找不到要更新的文件,则把它追加到备份文件的最后。 -x, --extract, 拆包文件 -t, --list ,查看打包文件列表 -r, --append 添加压缩文件 附选项: -b,--该选项是为磁带机设定的。其后跟一数字,用来说明区块的大小,系统预设值为20(20*512 bytes) -k,--保存已经存在的文件。例如我们把某个文件还原,在还原的过程中,遇到相同的文件,不会进行覆盖。 -m,--在还原文件时,把所有文件的修改时间设定为现在。 -M ,--创建多卷的档案文件,以便在几个磁盘中存放,当使用M选项向一个软驱进行存档时,tar命令在一张软盘已满的时候会提醒您再放入一张新的软盘。这样您就可以把tar档案存入几张磁盘中。 -v, --verbose 冗余显示,详细报告tar处理的文件信息。如无此选项,tar不报告文件信息。 -w 每一步都要求确认 -f, --file [HOSTNAME:]F 使用档案文件或设备,这个选项通常是必选的,请留意,在 f 之后要立即接档名喔!不要再加参数!例如使用『 tar -zcvfP tfile sfile』就是错误的写法,要写成『 tar -zcvPf tfile sfile』才对喔! -p :使用原文件的原来属性(属性不会依据使用者而变) -P :可以使用绝对路径来压缩! -N :比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的文件中! --exclude FILE:在压缩的过程中,不要将 FILE 打包! -z, --gzip, --ungzip 代替gzip命令,用gzip来压缩/解压缩文件,加上该选项后可以将档案文件进行压缩,但还原时也一定要使用该选项进行解压缩。 -j ,--针对*.tar.bz2文件,如果加 j 参数,则以 .tar.bz2 来作为附档名啊~ 注意: 也可以解压部分文件 tar -zxvf /tmp/etc.tar.gz etc/passwd
减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间。gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用。
gzip [选项] 压缩(解压缩)的文件名
选项:
-c 将输出写到标准输出上,并保留原有文件。
-d 将压缩文件解压。
-l 对每个压缩文件,显示下列字段:
压缩文件的大小
未压缩文件的大小
压缩比
未压缩文件的名字
-r 递归式地查找指定目录并压缩其中的所有文件或者是解压缩。
-t 测试,检查压缩文件是否完整。
-v 对每一个压缩和解压的文件,显示文件名和压缩比。
-num 用指定的数字num调整压缩的速度,-1或--fast表示最快压缩方法(低压缩比),-9或--best表示最慢压缩方法(高压缩比)。系统缺省值为6。
zcat *.gz 读取压缩文件内容
-示例:
-压缩文件tar.gz文件
# tar cvf backup.tar /etc # gzip -q backup.tar .gz(分两步完成,先打包在压缩,也可以使用管道命令)
或
# tar cvfz backup.tar.gz /etc/
-释放tar.gz文件
# gunzip backup.tar.gz #tar xvf backup.tar (分两步完成,先打包在压缩,也可以使用管道命令)
或
# tar xvfz backup.tar.gz
zip可能是目前使用的最多的文档压缩格式。优点:可以在不同的操作系统平台上使用。缺点:支持的压缩率不是很高。而tar.gz和tar.bz2在压缩率方面做得非常好。
用MS Windows下的压缩软件winzip压缩的文件如何在Linux系统下展开呢?可以用unzip命令,该命令用于解扩展名为.zip的压缩文件
zip [选项] newfilename.zip filename
unzip [选项] 压缩文件名.zip
选项:
-x 文件列表 解压缩文件,但不包括指定的file文件。
-v 查看压缩文件目录,但不解压。
-t 测试文件有无损坏,但不解压。
-d 目录 把压缩文件解到指定目录下。
-z 只显示压缩文件的注解。
-n 不覆盖已经存在的文件。
-o 覆盖已存在的文件且不要求用户确认。
-j 不重建文档的目录结构,把所有文件解压到同一目录下。
这个命令的功能是在压缩文件中寻找匹配的正则表达式,用法和grep命令一样,只不过操作的对象是压缩文件。如果用户想看看在某个压缩文件中有没有某一句话,便可用zgrep命令。
bzip2 [选项] 文档名.bz2
选项:
-c :将压缩的过程产生的资料输出到萤幕上!
-d :解压缩的参数
-z :压缩的参数
-# :与 gzip 同样的,都是在计算压缩比的参数, -9 最佳, -1 最快!
compress [选项] 文件或目录
选项:
-d :用来解压缩的参数
-r :可以连同目录下的文件也同时给予压缩
-c :将压缩资料输出成为 standard output (输出到萤幕)
dd if="input_file" of="outptu_file" bs="block_size" \count="number"
参数:
if :就是 input file 啰~也可以是装置喔!
of :就是 output file 喔~也可以是装置;
bs :规划的一个 block 的大小,如果没有设定时,预设是 512 bytes
count:多少个 bs 的意思。
cpio -covB > [file|device]
参数:
-o :将资料 copy 输出到文件或装置上
-i :将资料自文件或装置 copy 出来系统当中
-t :查看 cpio 建立的文件或装置的内容
-c :一种较新的 portable format 方式储存
-v :让储存的过程中文件名称可以在萤幕上显示
-B :让预设的 Blocks 可以增加至 5120 bytes ,预设是 512 bytes !
这样的好处是可以让大文件的储存速度加快(请参考 i-nodes 的观念)
-d :自动建立目录!由於 cpio 的内容可能不是在同一个目录内,
管道|(竖线):将第一个命令输出的内容通过管道符交给第二个命令去处理。依次类推。
常用的接受管道数据的命令:grep sed awk cut head top less more wc join sort split
例如:
ls | cat >ls.txt ///将ls命令的文件名,写入ls.txt文件
tree | cat >list.txt 将命令目录下的多级文件名写入一个txt文件
先放上资源 Xshell6_Xftrp6免装破解版 提取码:5ybx
解压后打开文件,找到 !绿化.bat 文件并运行,弹出运行框通过按任意键创建快捷方式
注意:进行远程登入和文件上传下载,在联网的情况下才能进行。没有联网可以去右上角的设置中打开。
一般情况,Linux都会安装在自己电脑的Windows上,但在企业中Linux的服务器一般都不在本机上,这个时候就需要进行远程登入,进行远程操作(使用命令行)
Xshell是目前最好的远程登入到Linux操作系统的软件(完美的解决了中文乱码问题)
安装好Xshell后,需要打开远程服务器的SSHD服务,该服务会监听22号端口
注意:在进行远程登入前,务必将Linux先开启
在创建前必须先知道Linux的IP
在Linux的终端输入ifconfig指令(终端框背景默认是白底黑字,可以通过编辑修改)
在这里插入图片描述
打开Xshell,创建新会话 <文件> <新建>
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
输入你要登入的账户和密码即可,我这里登入的是root账户
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
本机和Linux之间进行文件的上传下载,即进行文件传输
Xftp 是目前远程传输文件比较好用的软件
有了之前Xshell的操作,这个就简单了,同样创建新会话输入IP
协议(SFTP)
端口22
在这里插入图片描述
进行连接,现在就可以文件传输了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。