常用命令 – 百客网 https://www.qumai8.cn 明天的电商 是我的时代 谁与争锋 Sun, 21 Jul 2024 16:35:10 +0000 zh-Hans hourly 1 https://wordpress.org/?v=6.7.2 https://www.qumai8.cn/wp-content/uploads/2024/05/cropped-222-32x32.jpeg 常用命令 – 百客网 https://www.qumai8.cn 32 32 linux(centos)测试带宽 https://www.qumai8.cn/index.php/2020/08/3286/.html https://www.qumai8.cn/index.php/2020/08/3286/.html#respond Fri, 21 Aug 2020 04:55:29 +0000 https://www.qumai8.cn/?p=3286 1.安装speedtest-cli

speedtest-cli是一个用Python编写的轻量级Linux命令行工具,在Python2.4至3.4版本下均可运行。它基于Speedtest.net的基础架构来测量网络的上/下行速率。安装speedtest-cli很简单——只需要下载其Python脚本文件。

 2.下载并授权

# wget https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py

# chmod +rx speedtest.py

# sudo mv speedtest.py /usr/local/bin/speedtest-cli

# sudo chown root:root /usr/local/bin/speedtest-cli

 

使用speedtest-cli测试网速

使用speedtest-cli命令也很简单,它不需要任何参数即可工作。

 

# speedtest-cli

输入这个命令后,它会自动发现离你最近的Speedtest.net服务器(地理距离),然后打印出测试的网络上/下行速率。

speedtest-cli --bytes以字节计算的方式来测试上下行速度
speedtest-cli --share将速度测试的结果生成一张图片的连接,便于你分享
speedtest-cli --simple只显示ping和上下行速度
speedtest-cli --list 列出speedtest.net所有的服务器距离你的物理距离,单位是千米(km)

3.执行

linux(centos)测试带宽

4.在浏览器请求http连接,如下所示

linux(centos)测试带宽

查看帮助信息:

speedtest-cli -h

复制代码
usage: speedtest-cli [-h] [--no-download] [--no-upload] [--bytes] [--share]
                     [--simple] [--csv] [--csv-delimiter CSV_DELIMITER]
                     [--csv-header] [--json] [--list] [--server SERVER]
                     [--exclude EXCLUDE] [--mini MINI] [--source SOURCE]
                     [--timeout TIMEOUT] [--secure] [--no-pre-allocate]
                     [--version]

Command line interface for testing internet bandwidth using speedtest.net.
--------------------------------------------------------------------------
https://github.com/sivel/speedtest-cli

optional arguments:
  -h, --help            show this help message and exit
  --no-download         Do not perform download test
  --no-upload           Do not perform upload test
  --bytes               Display values in bytes instead of bits. Does not
                        affect the image generated by --share, nor output from
                        --json or --csv
  --share               Generate and provide a URL to the speedtest.net share
                        results image, not displayed with --csv
  --simple              Suppress verbose output, only show basic information
  --csv                 Suppress verbose output, only show basic information
                        in CSV format. Speeds listed in bit/s and not affected
                        by --bytes
  --csv-delimiter CSV_DELIMITER
                        Single character delimiter to use in CSV output.
                        Default ","
  --csv-header          Print CSV headers
  --json                Suppress verbose output, only show basic information
                        in JSON format. Speeds listed in bit/s and not
                        affected by --bytes
  --list                Display a list of speedtest.net servers sorted by
                        distance
  --server SERVER       Specify a server ID to test against. Can be supplied
                        multiple times
  --exclude EXCLUDE     Exclude a server from selection. Can be supplied
                        multiple times
  --mini MINI           URL of the Speedtest Mini server
  --source SOURCE       Source IP address to bind to
  --timeout TIMEOUT     HTTP timeout in seconds. Default 10
  --secure              Use HTTPS instead of HTTP when communicating with
                        speedtest.net operated servers
  --no-pre-allocate     Do not pre allocate upload data. Pre allocation is
                        enabled by default to improve upload performance. To
                        support systems with insufficient memory, use this
                        option to avoid a MemoryError
  --version             Show the version number and exit
复制代码

 

]]>
https://www.qumai8.cn/index.php/2020/08/3286/.html/feed 0
Shell cut命令:查找符合条件的行 https://www.qumai8.cn/index.php/2019/08/2268/.html https://www.qumai8.cn/index.php/2019/08/2268/.html#respond Fri, 16 Aug 2019 13:14:14 +0000 https://www.qumai8.cn/?p=2268 grep 命令是在文件中提取符合条件的行,也就是分析一行的信息,如果行中包含需要的信息,就把该行提取出来。而如果要进行列提取,就要利用 cut 命令了。

不过要小心,虽然 cut 命令用于提取符合条件的列,但是也要一行一行地进行数据提取。也就是说,先要读取文本的第一行数据,在此行中判断是否有符合条件的字段,然后再处理第二行数据。我们也可以把 cut 成为字段提取命令。命令格式如下:

[root@localhost ~]# cut [选项] 文件名

选项:

  • -f 列号:提取第几列;
  • -d 分隔符:按照指定分隔符分割列;
  • -c 字符范围:不依赖分隔符来区分列,而是通过字符范围(行首为 0)来进行字段提取。"n-"表示从第 n 个字符到行尾;"n-m"表示从第 n 个字符到第 m 个字符;"-m"表示从第 1 个字符到第 m 个字符;

cut 命令的默认分隔符是制表符,也就是 Tab 键,不想对空格符支持得不怎么好。我们先建立一个测试文件,然后看看 cut 命令的作用。

[root@localhost ~]# vi student.txt
ID Name gender Mark
1 Liming M 86
2 Sc M 90
3 Gao M 83

建立学员成绩表,注意这张表中所有的分隔符都是制表符,不能是空格,否则后面的实验会出现问题。

先看看 cut 命令该如何使用:

[root@localhost ~]# cut -f 2 student.txt
#提取第二列的内容
Name
Liming
Sc
Gao

如果想要提取多列呢?将列号直接用","隔开,命令如下:

[root@localhost ~]# cut -f 2,3 student.txt
#提取第二列和第三列的内容
Name gender
Liming M
Sc M
Gao M

cut 命令可以按照字符进行提取。需要注意的是,"8-"代表提取所有行从第 8 个字符到行尾,而"10-20"代表提取所有行的第 10~20 个字符,而"-8"代表提取所有行从行首到第 8 个字符,命令如下:

[root@localhost ~]#cut-c 8- student.txt
#提取取每行从第8个字符到行尾,好像很乱啊,那是因为每行的字符个数不相等
gender Mark
g M 86
90
83

当然,cut 命令也可以手工指定分隔符。例如,我想看看当前 Linux 服务器中有哪些用户、这些用户的 UID 是什么,就可以这样操作:

[root@localhost ~]# cut -d ":" -f 1,3 /etc/passwd
#以":"作为分隔符,提取/etc/passwd文件的第一列和第三列
root:0
bin:1
daemon:2
adm:3
lp:4

cut 命令很方便,不过最主要的问题是对空格识别得不好,很多命令的输出格式中都不是制表符,而是空格符,比如:

[root@localhost ~]# df
#统计分区使用状况
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda3 19923216 1848936 17062212 10% /
tmpfs 312672 0 312672 0% /dev/shm
/dev/sda1 198337 26359 161738 15% /boot
/dev/srO 3626176 3626176 0 100% /mnt/cdrom

如果想用 cut 命令截取第一列和第三列,就会出现这样的情况:

[root@localhost ~]# df -h|cut -d""-f 1,3
文件系统
/dev/sda3
tmpfs
/dev/sda1
/dev/sr0

第三列去哪里了?其实因为 df 命令输出的分隔符不是制表符,而是多个空格符,所以 cut 命令会忠实地将每个空格符当作一个分隔符,而这样数,第三列刚好也是空格,所以输出才会是上面这种情况。

总之,cut 命令不能很好地识别空格符。如果想要以空格符作为分隔符,建议使用 awk 命令。

]]>
https://www.qumai8.cn/index.php/2019/08/2268/.html/feed 0
linux grep 命令详解 https://www.qumai8.cn/index.php/2019/08/2246/.html https://www.qumai8.cn/index.php/2019/08/2246/.html#respond Fri, 16 Aug 2019 08:50:27 +0000 https://www.qumai8.cn/?p=2246 1.作用
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

2.格式
  grep [OPTIONS] PATTERN [FILE...]

3.主要参数
[options]主要参数:

-a或--text   不要忽略二进制的数据。
-A<显示列数>或--after-context=<显示列数>   除了显示符合范本样式的那一列之外,并显示该列之后的内容。
 -b或--byte-offset   在显示符合范本样式的那一列之前,标示出该列第一个字符的位编号。
-B<显示列数>或--before-context=<显示列数>   除了显示符合范本样式的那一列之外,并显示该列之前的内容。
-c或--count   计算符合范本样式的列数。
 -C<显示列数>或--context=<显示列数>或-<显示列数>   除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
 -d<进行动作>或--directories=<进行动作>   当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
-e<范本样式>或--regexp=<范本样式>   指定字符串做为查找文件内容的范本样式。
-E或--extended-regexp   将范本样式为延伸的普通表示法来使用。
-f<范本文件>或--file=<范本文件>   指定范本文件,其内容含有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每列一个范本样式。
 -F或--fixed-regexp   将范本样式视为固定字符串的列表。
 -G或--basic-regexp   将范本样式视为普通的表示法来使用。
-h或--no-filename   在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
 -H或--with-filename   在显示符合范本样式的那一列之前,表示该列所属的文件名称。
-i或--ignore-case   忽略字符大小写的差别。
-l或--file-with-matches   列出文件内容符合指定的范本样式的文件名称。
-L或--files-without-match   列出文件内容不符合指定的范本样式的文件名称。
 -n或--line-number   在显示符合范本样式的那一列之前,标示出该列的列数编号。
 -q或--quiet或--silent   不显示任何信息。
 -r或--recursive   此参数的效果和指定“-d recurse”参数相同。
-s或--no-messages   不显示错误信息。
-v或--revert-match   反转查找。
-V或--version   显示版本信息。
 -w或--word-regexp   只显示全字符合的列。
 -x或--line-regexp   只显示全列符合的列。
-y   此参数的效果和指定“-i”参数相同。
 --help   在线帮助。

4.grep命令使用简单实例
$ grep ‘test’ d*
显示所有以d开头的文件中包含 test的行。
$ grep ‘test’ aa bb cc
显示在aa,bb,cc文件中匹配test的行。
$ grep ‘[a-z]\{5\}’ aa
显示所有包含每个字符串至少有5个连续小写字符的字符串的行。
$ grep ‘w\(es\)t.*\1′ aa
如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着 另外一个es(\1),找到就显示该行。如果用egrep或grep -E,就不用”\”号进行转义,直接写成’w(es)t.*\1′就可以了。

5.grep命令使用复杂实例
假设您正在’/usr/src/Linux/Doc’目录下搜索带字符 串’magic’的文件:
$ grep magic /usr/src/Linux/Doc/*
sysrq.txt:* How do I enable the magic SysRQ key?
sysrq.txt:* How do I use the magic SysRQ key?
其中文件’sysrp.txt’包含该字符串,讨论的是 SysRQ 的功能。
默认情况下,’grep’只搜索当前目录。如果 此目录下有许多子目录,’grep’会以如下形式列出:
grep: sound: Is a directory
这可能会使’grep’ 的输出难于阅读。这里有两种解决的办法:
明确要求搜索子目录:grep -r
或忽略子目录:grep -d skip
如果有很多 输出时,您可以通过管道将其转到’less’上阅读:
$ grep magic /usr/src/Linux/Documentation/* | less
这样,您就可以更方便地阅读。

有一点要注意,您必需提供一个文件过滤方式(搜索全部文件的话用 *)。如果您忘了,’grep’会一直等着,直到该程序被中断。如果您遇到了这样的情况,按 <CTRL c> ,然后再试。

下面还有一些有意思的命令行参数:
 grep -i pattern files :不区分大小写地搜索。默认情况区分大小写,
 grep -l pattern files :只列出匹配的文件名,
 grep -L pattern files :列出不匹配的文件名,
 grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配’magic’,而不是’magical’),
  grep -C number pattern files :匹配的上下文分别显示[number]行,
grep pattern1 | pattern2 files :显示匹配 pattern1 或 pattern2 的行,
 grep pattern1 files | grep pattern2 :显示既匹配 pattern1 又匹配 pattern2 的行。

grep -n pattern files  即可显示行号信息

grep -c pattern files  即可查找总行数

]]>
https://www.qumai8.cn/index.php/2019/08/2246/.html/feed 0
Linux 命令之nl命令 https://www.qumai8.cn/index.php/2019/08/2232/.html https://www.qumai8.cn/index.php/2019/08/2232/.html#respond Wed, 14 Aug 2019 09:21:46 +0000 https://www.qumai8.cn/?p=2232 1、命令简介

nl (Number of Lines) 将指定的文件添加行号标注后写到标准输出。如果不指定文件或指定文件为"-" ,程序将从标准输入读取数据。

2、用法

nl [选项]... [文件]...

3、选项

复制代码
  -b, --body-numbering=样式    使用指定样式编号文件的正文行目
  -d, --section-delimiter=CC    使用指定的CC 分割逻辑页数
  -f, --footer-numbering=样式    使用指定样式编号文件的页脚行目
  -h, --header-numbering=样式    使用指定样式编号文件的页眉行目
  -i, --page-increment=数值    设置每一行遍历后的自动递增值
  -l, --join-blank-lines=数值    设置数值为多少的若干空行被视作一行

-n, --number-format= 格式    根据指定格式插入行号
-p, --no-renumber        在逻辑页数切换时不将行号值复位
-s, --number-separator=字符串    可能的话在行号后添加字符串
-v, --starting-line-number=数字    每个逻辑页上的第一行的行号
-w, --number-width= 数字    为行号使用指定的栏数
--help        显示此帮助信息并退出
--version        显示版本信息并退出

默认的选项设置是-v1 -i1 -l1 -sTAB -w6 -nrn -hn -bt -fn。CC 是用于分隔逻辑页数的两个分界符,其中缺失的第二个字符暗含了":",如果您要指定"\",
请输入"\\"。可用的样式如下:

a    对所有行编号
t    对非空行编号
n    不编行号
pBRE    只对符合正则表达式BRE 的行编号

FORMAT 是下列之一:

ln    左对齐,空格不用0 填充
rn     右对齐,空格不用0 填充
rz     右对齐,空格用0 填充

复制代码

4、示例

示例1:显示行号
[root@oracledb study]# nl test1.log 
     1    2011
     2    2012
     3    2013
示例2:显示行号,指定对齐方式
复制代码
[root@oracledb study]# nl -nln test1.log 
1         2011
2         2012
3         2013
[root@oracledb study]# nl -nrn test1.log 
     1    2011
     2    2012
     3    2013
[root@oracledb study]# nl -nrz test1.log 
000001    2011
000002    2012
000003    2013
复制代码
示例3:指定宽度为4位 默认为6位
[root@oracledb study]# nl -nrz -w 4 test1.log 
0001    2011
0002    2012
0003    2013
示例4:将标准输入的内容编号
复制代码
[root@oracledb study]# nl
line1
     1    line1
line2 
     2    line2
line3
     3    line3
[root@oracledb study]#
复制代码
按ctrl+D结束输入
or EOF(End Of File)
复制代码
[root@oracledb study]# nl <<EOF
> line1
> line2
> line3
> EOF
     1    line1
     2    line2
     3    line3
复制代码
]]>
https://www.qumai8.cn/index.php/2019/08/2232/.html/feed 0
sed命令详解 https://www.qumai8.cn/index.php/2019/08/2159/.html https://www.qumai8.cn/index.php/2019/08/2159/.html#respond Fri, 09 Aug 2019 01:25:53 +0000 https://www.qumai8.cn/?p=2159 一、基础篇

1、sed工作原理

sed工作的过程是先从文件中读取一行内容到模式空间里即sed专属的缓存空间,然后判断这行内容是否是需要处理的内容,如果不是就继续从文件中读取下一行,否则对改行内容进行相应处理后输出,然后继续读取下一行进行判断或处理,直到文件最后一行处理完毕整个过程结束。

2、sed命令使用说明

sed命令格式如下:

sed  参数  功能选项  文件名或其他标准输入

sed参数如下:

-i  修改文件内容

-n  取消默认输出

sed功能选项如下:

a  追加内容到指定行后

i  插入内容到指定行前

d  删除指定行

c  用新行替换旧行(不常用)

s  对每一行第一次匹配到的内容进行替换,配合标志g可以将一行中所有匹配到的内容进行替换

p  输出指定内容,默认会输出2次匹配到的内容

sed指定操作行的格式有以下几种:

10             匹配第十行
10,20                匹配第十行到第二十行
10,+20            匹配第十行到第三十行(10+20)
1~2              匹配第一行开始的奇数行
10,$             匹配第十行到最后一行
/oldboy/             匹配有oldboy的行
/oldboy/,/Alex/        匹配有oldboy的行到有Alex的行
/oldboy/,$          匹配有oldboy的行到最后一行
/oldboy/,10           匹配有oldboy的行到第十行,如果前十行没有匹配到有oldboy的行会对后面匹配到有oldboy的行进行操作
1,/Alex/           匹配第一行到有Alex的行
/oldboy/,+2           匹配有oldboy的行及之后的两行

sed s 替换脚本命令

此命令的基本格式为:

[address]s/pattern/replacement/flags

其中,address 表示指定要操作的具体行,pattern 指的是需要替换的内容,replacement 指的是要替换的新内容。

关于指定具体操作行(address)的用法,这里先不做解释,文章后续会对其做详细介绍。

此命令中常用的 flags 标记如表 2 所示。

表 2 sed s命令flags标记及功能
flags 标记 功能
n 1~512 之间的数字,表示指定要替换的字符串出现第几次时才进行替换,例如,一行中有 3 个 A,但用户只想替换第二个 A,这是就用到这个标记;
g 对数据中所有匹配到的内容进行替换,如果没有 g,则只会在第一次匹配成功时做替换操作。例如,一行数据中有 3 个 A,则只会替换第一个 A;
p 会打印与替换命令中指定的模式匹配的行。此标记通常与 -n 选项一起使用。
w file 将缓冲区中的内容写到指定的 file 文件中;
& 用正则表达式匹配的内容进行替换;
n 匹配第 n 个子串,该子串之前在 pattern 中用 () 指定。
转义(转义替换部分包含:&、 等)。

比如,可以指定 sed 用新文本替换第几处模式匹配的地方:

[root@localhost ~]# sed 's/test/trial/2' data4.txt
This is a test of the trial script.
This is the second test of the trial script.

可以看到,使用数字 2 作为标记的结果就是,sed 编辑器只替换每行中第 2 次出现的匹配模式。

如果要用新文件替换所有匹配的字符串,可以使用 g 标记:

[root@localhost ~]# sed 's/test/trial/g' data4.txt
This is a trial of the trial script.
This is the second trial of the trial script.

我们知道,-n 选项会禁止 sed 输出,但 p 标记会输出修改过的行,将二者匹配使用的效果就是只输出被替换命令修改过的行,例如:

[root@localhost ~]# cat data5.txt
This is a test line.
This is a different line.
[root@localhost ~]# sed -n 's/test/trial/p' data5.txt
This is a trial line.

w 标记会将匹配后的结果保存到指定文件中,比如:

[root@localhost ~]# sed 's/test/trial/w test.txt' data5.txt
This is a trial line.
This is a different line.
[root@localhost ~]#cat test.txt
This is a trial line.

在使用 s 脚本命令时,替换类似文件路径的字符串会比较麻烦,需要将路径中的正斜线进行转义,例如:

[root@localhost ~]# sed 's//bin/bash//bin/csh/' /etc/passwd

  sed的特殊操作:

1:反斜杠接数字是sed配合正则的分组匹配的特殊技巧名为后项引用,sed命令在使用正则匹配时会记住圆括号即分组匹配匹配到的内容,使用反斜杠接数字的方式即可取出对应顺序被sed记住的内容,需要注意的是sed最多只能记住九个分组匹配的内容,也就是说反斜杠后面能接的最大的数字是九。

&:在sed匹配中这个符号表示前面需要被替换掉的内容。

3、企业实际使用案例

1)优化SSH配置

#在ssh配置文件的13行之前插入5行配置,每一行配置用n分隔
sed -i '13i Port 52113nPermitRootLogin nonPermitEmptyPasswords nonUseDNS nonGSSAPIAuthentication no' /etc/ssh/sshd_config

2)打印文件内容但不包含oldboy

文件内容如下:

101,oldboy,CEO
102,zhangyao,CTO
103,alex,COO
104,yy,CFO
105,feixue,CIO

#将匹配有oldboy的行删除即可在输出内容中不显示包含oldboy的行,因为没加-i参数所以对#文件没有实际影响
sed  '/oldboy/d' person.txt

3)指定行修改配置文件

#修改selinux的配置文件,将selinux的级别从enforcing改为disabled
sed  -i  '7s/enforcing/disabled/'  /etc/selinux/config

4)系统开机启动项优化

chkconfig  --list|grep '3:on'|grep  -vE  'sshd|crond|network|rsyslog|sysstat'|awk  '{print $1}'|sed -r  's/^(.*)/chkconfig 1 off/g'|bash

5)批量重命名文件

/test目录下有如下文件:

stu_1029999_1_finished.jpg stu_1029999_2_finished.jpg  stu_1029999_3_finished.jpg  stu_1029999_4_finished.jpg  stu_1029999_5_finished.jpg

ls  /test/*jpg|sed -r 's/(^.*)_finished.*/mv & 1.jpg/g'|bash
]]>
https://www.qumai8.cn/index.php/2019/08/2159/.html/feed 0
Linux sed 命令 https://www.qumai8.cn/index.php/2019/08/2154/.html https://www.qumai8.cn/index.php/2019/08/2154/.html#respond Fri, 09 Aug 2019 01:21:48 +0000 https://www.qumai8.cn/?p=2154 Linux sed 命令是利用脚本来处理文本文件。

sed 可依照脚本的指令来处理、编辑文本文件。

Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。

语法

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

参数说明

  • -e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
  • -f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
  • -h或--help 显示帮助。
  • -n或--quiet或--silent 仅显示script处理后的结果。
  • -V或--version 显示版本信息。

动作说明

  • a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
  • c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
  • d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
  • i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
  • p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
  • s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

实例

在testfile文件的第四行后添加一行,并将结果输出到标准输出,在命令行提示符下输入如下命令:

sed -e 4anewLine testfile 

首先查看testfile中的内容如下:

$ cat testfile #查看testfile 中的内容  
HELLO LINUX!  
Linux is a free unix-type opterating system.  
This is a linux testfile!  
Linux test 

使用sed命令后,输出结果如下:

$ sed -e 4anewline testfile #使用sed 在第四行后添加新字符串  
HELLO LINUX! #testfile文件原有的内容  
Linux is a free unix-type opterating system.  
This is a linux testfile!  
Linux test  
newline 

以行为单位的新增/删除

将 /etc/passwd 的内容列出并且列印行号,同时,请将第 2~5 行删除!

[root@www ~]# nl /etc/passwd | sed '2,5d'
1 root:x:0:0:root:/root:/bin/bash
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
.....(后面省略).....

sed 的动作为 '2,5d' ,那个 d 就是删除!因为 2-5 行给他删除了,所以显示的数据就没有 2-5 行罗~ 另外,注意一下,原本应该是要下达 sed -e 才对,没有 -e 也行啦!同时也要注意的是, sed 后面接的动作,请务必以 '' 两个单引号括住喔!

只要删除第 2 行

nl /etc/passwd | sed '2d' 

要删除第 3 到最后一行

nl /etc/passwd | sed '3,$d' 

在第二行后(亦即是加在第三行)加上『drink tea?』字样!

[root@www ~]# nl /etc/passwd | sed '2a drink tea'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
drink tea
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
.....(后面省略).....

那如果是要在第二行前

nl /etc/passwd | sed '2i drink tea' 

如果是要增加两行以上,在第二行后面加入两行字,例如 Drink tea or ..... 与 drink beer?

[root@www ~]# nl /etc/passwd | sed '2a Drink tea or ......
> drink beer ?'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
Drink tea or ......
drink beer ?
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
.....(后面省略).....

每一行之间都必须要以反斜杠『 』来进行新行的添加喔!所以,上面的例子中,我们可以发现在第一行的最后面就有 存在。

以行为单位的替换与显示

将第2-5行的内容取代成为『No 2-5 number』呢?

[root@www ~]# nl /etc/passwd | sed '2,5c No 2-5 number'
1 root:x:0:0:root:/root:/bin/bash
No 2-5 number
6 sync:x:5:0:sync:/sbin:/bin/sync
.....(后面省略).....

透过这个方法我们就能够将数据整行取代了!

仅列出 /etc/passwd 文件内的第 5-7 行

[root@www ~]# nl /etc/passwd | sed -n '5,7p'
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

可以透过这个 sed 的以行为单位的显示功能, 就能够将某一个文件内的某些行号选择出来显示。

数据的搜寻并显示

搜索 /etc/passwd有root关键字的行

nl /etc/passwd | sed '/root/p'
1  root:x:0:0:root:/root:/bin/bash
1  root:x:0:0:root:/root:/bin/bash
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh
3  bin:x:2:2:bin:/bin:/bin/sh
4  sys:x:3:3:sys:/dev:/bin/sh
5  sync:x:4:65534:sync:/bin:/bin/sync
....下面忽略 

如果root找到,除了输出所有行,还会输出匹配行。

使用-n的时候将只打印包含模板的行。

nl /etc/passwd | sed -n '/root/p'
1  root:x:0:0:root:/root:/bin/bash

数据的搜寻并删除

删除/etc/passwd所有包含root的行,其他行输出

nl /etc/passwd | sed  '/root/d'
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh
3  bin:x:2:2:bin:/bin:/bin/sh
....下面忽略
#第一行的匹配root已经删除了

数据的搜寻并执行命令

搜索/etc/passwd,找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把bash替换为blueshell,再输出这行:

nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p;q}'    
1  root:x:0:0:root:/root:/bin/blueshell

最后的q是退出。

数据的搜寻并替换

除了整行的处理模式之外, sed 还可以用行为单位进行部分数据的搜寻并取代。基本上 sed 的搜寻与替代的与 vi 相当的类似!他有点像这样:

sed 's/要被取代的字串/新的字串/g'

先观察原始信息,利用 /sbin/ifconfig 查询 IP

[root@www ~]# /sbin/ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:90:CC:A6:34:84
inet addr:192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::290:ccff:fea6:3484/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
.....(以下省略).....

本机的ip是192.168.1.100。

将 IP 前面的部分予以删除

[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g'
192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0

接下来则是删除后续的部分,亦即: 192.168.1.100 Bcast:192.168.1.255 Mask:255.255.255.0

将 IP 后面的部分予以删除

[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
192.168.1.100

多点编辑

一条sed命令,删除/etc/passwd第三行到末尾的数据,并把bash替换为blueshell

nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'
1  root:x:0:0:root:/root:/bin/blueshell
2  daemon:x:1:1:daemon:/usr/sbin:/bin/sh

-e表示多点编辑,第一个编辑命令删除/etc/passwd第三行到末尾的数据,第二条命令搜索bash替换为blueshell。

直接修改文件内容(危险动作)

sed 可以直接修改文件的内容,不必使用管道命令或数据流重导向! 不过,由於这个动作会直接修改到原始的文件,所以请你千万不要随便拿系统配置来测试! 我们还是使用文件 regular_express.txt 文件来测试看看吧!

regular_express.txt 文件内容如下:

[root@www ~]# cat regular_express.txt 
runoob.
google.
taobao.
facebook.
zhihu-
weibo-

利用 sed 将 regular_express.txt 内每一行结尾若为 . 则换成 !

[root@www ~]# sed -i 's/.$/!/g' regular_express.txt
[root@www ~]# cat regular_express.txt 
runoob!
google!
taobao!
facebook!
zhihu-
weibo-

:q:q

利用 sed 直接在 regular_express.txt 最后一行加入 # This is a test:

[root@www ~]# sed -i '$a # This is a test' regular_express.txt
[root@www ~]# cat regular_express.txt 
runoob!
google!
taobao!
facebook!
zhihu-
weibo-
# This is a test

由於 $ 代表的是最后一行,而 a 的动作是新增,因此该文件最后新增 # This is a test

sed 的 -i 选项可以直接修改文件内容,这功能非常有帮助!举例来说,如果你有一个 100 万行的文件,你要在第 100 行加某些文字,此时使用 vim 可能会疯掉!因为文件太大了!那怎办?就利用 sed 啊!透过 sed 直接修改/取代的功能,你甚至不需要使用 vim 去修订!

]]>
https://www.qumai8.cn/index.php/2019/08/2154/.html/feed 0
shell变量的替换2 https://www.qumai8.cn/index.php/2019/08/2141/.html https://www.qumai8.cn/index.php/2019/08/2141/.html#respond Thu, 08 Aug 2019 06:13:38 +0000 https://www.qumai8.cn/?p=2141 1.条件变量替换:
Bash Shell可以进行变量的条件替换,既只有某种条件发生时才进行替换,替换
条件放在{}中.
(1) ${value:-word}
当变量未定义或者值为空时,返回值为word的内容,否则返回变量的值.
(2) ${value:=word}
与前者类似,只是若变量未定义或者值为空时,在返回word的值的同时将
word赋值给value
(3) ${value:?message}
若变量以赋值的话,正常替换.否则将消息message送到标准错误输出(若
此替换出现在Shell程序中,那么该程序将终止运行)
(4) ${value:+word}
若变量以赋值的话,其值才用word替换,否则不进行任何替换
(5) ${value:offset}
${value:offset:length}
从变量中提取子串,这里offset和length可以是算术表达式.
(6) ${#value}
变量的字符个数 (变量的字符个数,并不是变量个数)
(7) ${value#pattern}
${value##pattern}
去掉value中与pattern相匹配的部分,条件是value的开头与pattern相匹配
#与##的区别在于一个是最短匹配模式,一个是最长匹配模式.
(8) ${value%pattern}
${value%%pattern}
于(7)类似,只是是从value的尾部于pattern相匹配,%与%%的区别与#与##一样
(9) ${value/pattern/string}
${value//pattern/string}
进行变量内容的替换,把与pattern匹配的部分替换为string的内容,/与//的区
别与上同

注意:上述条件变量替换中,除(2)外,其余均不影响变量本身的值

2.变量的算术运算
在Bash Shell中,只能进行两个整数间的运算,其结果仍为整数.要进行算术
运算,需要使用let命令,语法为:
let expr
expr是一个包含项和操作符的表达式,项可以是一个变量或是一个整数常数,
当使用整数常数时,其默认为十进制整数,用户可以用radio#number来指定其它
形式的整数,其中radio定义了整数是几进制表示的,number是该整数的值.若
radio>10,那么数字字符可从0-9和A-Z.
在表达式中支持的操作符及其含义为:
+,-,*,/,% 加,减,乘,除,取模
>>,<<,&,^,| 左移,右移,位与,位异或,位或
?: 三元运算符.与C语言中的定义一致
~ 取补码
!,>=,<=,>,<,==,!=,&&,||
=,+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=
表达式式中也可以使用括号.括号或运算优先级的定义与一般计算机语言中的
相同.
let命令具有返回值.当计算结果(若有多个表达式时,以最后一个为准)为0时,
返回值为1,否则为0.
当表达式中含有shell的特殊字符(如|)时,需要用引用符('或")将其引用起来.
使用let时还需要注意的时,对于let x+y这样的式子,shell虽然计算了x+y的值
但却将结果丢弃,若不想这样,可以使用let sum=x+y将x+y的结果保存在变量sum中
另外还可以使用((和))操作符取代let命令,而且这样的话,还可以省去对算术
表达式的引用,如果想返回表达式的值,则需用$(())的格式.

if的条件中,“=”用于比较字符串;“-eq”用于比较整型数。

Bash内建参数
===========

PPID : 该bash的呼叫者process ID.
PWD : 目前的工作目录。
OLDPWD : 上一个工作目录。
REPLY : 当read命令没有参数时,直接设在REPLY上。
UID : User ID。
EUID : Effective User ID。
BASH : Bash的完整路径。
BASH_VERSION : Bash版本。
SHLVL : 每次有Bash执行时,数字加一。
RANDOM : 每次这个参数被用到时,就会产生一个乱数在RANDOM上。
SECONDS : 从这个Shell一开始启动後的时间。
LINENO : Script的行数。
HISTCMD : 历史记录数。
OPTARG : getopts处理的最後一个选项参数。
OPTIND : 下一个要由getopts所处理的参数号码。
HOSTTYPE : 机器种类。
OSTYPE : 作业系统名称。
IFS : Internal Field Separator。
PATH : 命令搜寻路径。
PATH="/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin:."
HOME : 目前使用者的home directory;
CDPATH : cd命令的搜寻路径。
ENV : 如果这个参数被设定,每次有shell script被执行时,将会执行它所设定的档名做为环境设定。
MAIL : 如果这个参数被设定,而且MAILPATH没有被设定,那麽有信件进来时,bash会通知使用者。
MAILCHECK : 设定多久时间检查邮件一次。
MAILPATH : 一串的邮件检查路径。
MAIL_WARNING : 如果有设定的话,邮件被读取後,将会显示讯息。
PS1 : 提示讯息设定,内定为"bash$ "。(请详见提示讯息一节。)
PS2 : 第二提示讯息设定,内定为"> "。
PS3 : select命令所使用的提示讯息。
PS4 : 执行追踪时用的提示讯息设定,内定为"+ "。
HISTSIZE : 命令历史记录量,内定为500。
HISTFILE : 历史记录档,内定~/.bash_history。
HISTFILESIZE : 历史记录档行数最大值,内定500。
OPTERR : 如果设为1,bash会显示getopts的错误。
PROMPT_COMMAND : 如果设定的话,该值会在每次执行命令前都显示。
IGNOREEOF : 将EOF值当成输入,内定为10。
TMOUT : 如果设为大於零,该值被解译为输入等待秒数。若无输入,当成没有输入。
FCEDIT : fc命令的内定编辑器。
FIGNORE : 请详见READLINE。
INPUTRC : readline的startup file,内定~/.inputrc
notify : 如果设定了,bash立即报告被终结的背景程式。
history_control, HISTCONTROL : history使用。
command_oriented_history : 存入多行指令。
glob_dot_filenames : 如果设定了,bash将会把"."包含入档案路径中。
allow_null_glob_expansion : 如果设定了,bash允许路径明称为null string。
histchars : history使用。
nolinks : 如果设定了,执行指令时,不会跟随symbolic links。
hostname_completion_file, HOSTFILE : 包含与/etc/hosts相同格式的档名。
noclobber : 如果设定了,Bash不会覆写任何由">"、">&"及"<>"所操作的档案。
auto_resume : 请见任务控制一节。
no_exit_on_failed_exec : 如果该值存在,非互动的shell不会因为exec失败而跳出。

cdable_vars : 如果启动,而cd命令找不到目录,可切换到参数形态指定的目录下。

]]>
https://www.qumai8.cn/index.php/2019/08/2141/.html/feed 0
Linux下Shell的for循环语句 https://www.qumai8.cn/index.php/2019/08/2004/.html https://www.qumai8.cn/index.php/2019/08/2004/.html#respond Thu, 01 Aug 2019 09:09:58 +0000 https://www.qumai8.cn/?p=2004 第一类:数字性循环
-----------------------------
for1-1.sh

#!/bin/bash  
  
for((i=1;i<=10;i++));  
do   
echo $(expr $i \* 3 + 1);  
done

-----------------------------
for1-2.sh

#!/bin/bash  
  
for i in $(seq 1 10)  
do   
echo $(expr $i \* 3 + 1);  
done

-----------------------------
for1-3.sh

#!/bin/bash  
  
for i in {1..10}  
do  
echo $(expr $i \* 3 + 1);  
done

-----------------------------
for1-4.sh

#!/bin/bash  
  
awk 'BEGIN{for(i=1; i<=10; i++) print i}'

第二类:字符性循环
-----------------------------
for2-1.sh

#!/bin/bash  
  
for i in `ls`;  
do   
echo $i is file name\! ;  
done

-----------------------------
for2-2.sh

#!/bin/bash  
  
for i in $* ;  
do  
echo $i is input chart\! ;  
done

-----------------------------
for2-3.sh

#!/bin/bash  
  
for i in f1 f2 f3 ;  
do  
echo $i is appoint ;  
done

-----------------------------
for2-4.sh

复制代码
#!/bin/bash  
  
list="rootfs usr data data2"  
for i in $list;  
do  
echo $i is appoint ;  
done
复制代码

第三类:路径查找
-----------------------------
for3-1.sh

#!/bin/bash  
  
for file in /proc/*;  
do  
echo $file is file path \! ;  
done

-----------------------------
for3-2.sh

#!/bin/bash  
  
for file in $(ls *.sh)  
do  
echo $file is file path \! ;  
done

总结:

现在一般都使用for in结构,for in结构后面可以使用函数来构造范围,比如$()、``这些,里面写一些查找的语法,比如ls test*,那么遍历之后就是输出文件名了。

 

]]>
https://www.qumai8.cn/index.php/2019/08/2004/.html/feed 0
shell之a+b求和l脚本的三种写法 https://www.qumai8.cn/index.php/2019/08/1999/.html https://www.qumai8.cn/index.php/2019/08/1999/.html#respond Thu, 01 Aug 2019 08:46:42 +0000 https://www.qumai8.cn/?p=1999 第一种
#!/bin/bash
a=5
b=10
c=$[ $a+$b ]
echo ${c}

第二种

#!/bin/bash
a=5
b=10
let "c=a+b"
echo ${c}

第三种

#!/bin/bash
a=5
b=10
((c=a+b))
echo ${c}
]]>
https://www.qumai8.cn/index.php/2019/08/1999/.html/feed 0
Shell cut命令:查找符合条件的行 https://www.qumai8.cn/index.php/2019/08/1994/.html https://www.qumai8.cn/index.php/2019/08/1994/.html#respond Thu, 01 Aug 2019 07:47:32 +0000 https://www.qumai8.cn/?p=1994 grep 命令是在文件中提取符合条件的行,也就是分析一行的信息,如果行中包含需要的信息,就把该行提取出来。而如果要进行列提取,就要利用 cut 命令了。

不过要小心,虽然 cut 命令用于提取符合条件的列,但是也要一行一行地进行数据提取。也就是说,先要读取文本的第一行数据,在此行中判断是否有符合条件的字段,然后再处理第二行数据。我们也可以把 cut 成为字段提取命令。命令格式如下:

[root@localhost ~]# cut [选项] 文件名

选项:

  • -f 列号:提取第几列;
  • -d 分隔符:按照指定分隔符分割列;
  • -c 字符范围:不依赖分隔符来区分列,而是通过字符范围(行首为 0)来进行字段提取。"n-"表示从第 n 个字符到行尾;"n-m"表示从第 n 个字符到第 m 个字符;"-m"表示从第 1 个字符到第 m 个字符;

cut 命令的默认分隔符是制表符,也就是 Tab 键,不想对空格符支持得不怎么好。我们先建立一个测试文件,然后看看 cut 命令的作用。

[root@localhost ~]# vi student.txt
ID Name gender Mark
1 Liming M 86
2 Sc M 90
3 Gao M 83

建立学员成绩表,注意这张表中所有的分隔符都是制表符,不能是空格,否则后面的实验会出现问题。

先看看 cut 命令该如何使用:

[root@localhost ~]# cut -f 2 student.txt
#提取第二列的内容
Name
Liming
Sc
Gao

如果想要提取多列呢?将列号直接用","隔开,命令如下:

[root@localhost ~]# cut -f 2,3 student.txt
#提取第二列和第三列的内容
Name gender
Liming M
Sc M
Gao M

cut 命令可以按照字符进行提取。需要注意的是,"8-"代表提取所有行从第 8 个字符到行尾,而"10-20"代表提取所有行的第 10~20 个字符,而"-8"代表提取所有行从行首到第 8 个字符,命令如下:

[root@localhost ~]#cut-c 8- student.txt
#提取取每行从第8个字符到行尾,好像很乱啊,那是因为每行的字符个数不相等
gender Mark
g M 86
90
83

当然,cut 命令也可以手工指定分隔符。例如,我想看看当前 Linux 服务器中有哪些用户、这些用户的 UID 是什么,就可以这样操作:

[root@localhost ~]# cut -d ":" -f 1,3 /etc/passwd
#以":"作为分隔符,提取/etc/passwd文件的第一列和第三列
root:0
bin:1
daemon:2
adm:3
lp:4

cut 命令很方便,不过最主要的问题是对空格识别得不好,很多命令的输出格式中都不是制表符,而是空格符,比如:

[root@localhost ~]# df
#统计分区使用状况
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda3 19923216 1848936 17062212 10% /
tmpfs 312672 0 312672 0% /dev/shm
/dev/sda1 198337 26359 161738 15% /boot
/dev/srO 3626176 3626176 0 100% /mnt/cdrom

如果想用 cut 命令截取第一列和第三列,就会出现这样的情况:

[root@localhost ~]# df -h|cut -d""-f 1,3
文件系统
/dev/sda3
tmpfs
/dev/sda1
/dev/sr0

第三列去哪里了?其实因为 df 命令输出的分隔符不是制表符,而是多个空格符,所以 cut 命令会忠实地将每个空格符当作一个分隔符,而这样数,第三列刚好也是空格,所以输出才会是上面这种情况。

总之,cut 命令不能很好地识别空格符。如果想要以空格符作为分隔符,建议使用 awk 命令。

]]>
https://www.qumai8.cn/index.php/2019/08/1994/.html/feed 0