【Shell牛客刷题系列】SHELL23 nginx日志分析1-IP统计

2023-10-27



该系列是基于牛客Shell题库,针对具体题目进行查漏补缺,学习相应的命令。

刷题链接:牛客题霸-Shell篇

该系列文章都放到专栏下,专栏链接为:《专栏:Shell》。欢迎关注专栏~

本文知识预告:

  • 本文首先复习了substr()截取字符串函数和sortsed、和awk命令的相关的用法;
  • 然后,给出了三种题目的解决方案,基本算是前面题目都用到过的命令。


SHELL23 nginx日志分析1-IP统计

假设nginx的日志存储在nowcoder.txt里,内容如下:

192.168.1.20 - - [21/Apr/2020:14:27:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.21 - - [21/Apr/2020:15:27:49 +0800] "GET /2/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.22 - - [21/Apr/2020:21:27:49 +0800] "GET /3/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.23 - - [21/Apr/2020:22:27:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.24 - - [22/Apr/2020:15:27:49 +0800] "GET /2/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.25 - - [22/Apr/2020:15:26:49 +0800] "GET /3/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.20 - - [23/Apr/2020:08:27:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.21 - - [23/Apr/2020:09:20:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.22 - - [23/Apr/2020:10:27:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.22 - - [23/Apr/2020:10:27:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.20 - - [23/Apr/2020:14:27:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.21 - - [23/Apr/2020:15:27:49 +0800] "GET /2/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.22 - - [23/Apr/2020:15:27:49 +0800] "GET /3/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.25 - - [23/Apr/2020:16:27:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.24 - - [23/Apr/2020:20:27:49 +0800] "GET /2/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.25 - - [23/Apr/2020:20:27:49 +0800] "GET /3/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.20 - - [23/Apr/2020:20:27:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.21 - - [23/Apr/2020:20:27:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.22 - - [23/Apr/2020:20:27:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.22 - - [23/Apr/2020:15:27:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
192.168.1.21 - - [23/Apr/2020:20:27:49 +0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"

现在需要编写shell脚本统计出2020年4月23号访问ip的对应次数,并且按照次数降序排序。你的脚本应该输出:

5 192.168.1.22
4 192.168.1.21
3 192.168.1.20
2 192.168.1.25
1 192.168.1.24

相关命令学习

awk:文本和数据进行处理的编程语言

awk命令来自于三位创始人”Alfred Aho,Peter Weinberger, Brian Kernighan “的姓氏缩写,其功能是用于对文本和数据进行处理的编程语言。使用awk命令可以让用户自定义函数或正则表达式对文本内容进行高效管理,与sedgrep并称为Linux系统中的文本三剑客。

语法格式awk 参数 文件

常用参数

参数 功能
-F 指定输入时用到的字段分隔符
-v 自定义变量
-f 从脚本中读取awk命令
-m val值设置内在限制

常用的awk内置变量

awk语法由一系列条件和动作组成,在花括号内可以有多个动作,多个动作之间用分号分隔,在多个条件和动作之间可以有若干空格,也可以没有。

变量名称 说明
FILENAME 当前输入文档的文件名
FNR 当前输入文档的当前行号,尤其当多个输入文档时有用
FS 设置字段分隔符,默认为空格或制表符
NF 当前记录(行)的字段(列)个数
NR 输入数据流的当前记录数(行号)
OFS 输出字段分隔符,默认为空格
ORS 输出记录分隔符,默认为换行符
RS 输入记录分隔符,默认为换行符

awk是一种处理文本文件的编程语言,文件的每行数据都被称为记录默认以空格或制表符为分隔符每条记录被分成若干字段(列)awk每次从文件中读取一条记录

sort:对文件内容进行排序

sort命令的功能是对文件内容进行排序。有时文本中的内容顺序不正确,一行行地手动修改实在太麻烦了。此时使用sort命令就再合适不过了,它能够对文本内容进行再次排序。

语法格式:sort [参数] 文件

常用参数:

-b 忽略每行前面开始出的空格字符
-c 检查文件是否已经按照顺序排序
-d 除字母、数字及空格字符外,忽略其他字符
-f 将小写字母视为大写字母
-i 除040至176之间的ASCII字符外,忽略其他字符
-m 将几个排序号的文件进行合并
-M 将前面3个字母依照月份的缩写进行排序
-n 依照数值的大小排序
-o <输出文件> 将排序后的结果存入制定的文件
-r 以相反的顺序来排序
-t <分隔字符> 指定排序时所用的栏位分隔字符
-k 指定需要排序的栏位
-s 通过禁用最后的比较来稳定排序

grep:强大的文本搜索工具

grep来自于英文词组“global search regular expression and print out the line”的缩写,意思是用于全面搜索的正则表达式,并将结果输出。人们通常会将grep命令与正则表达式搭配使用,参数作为搜索过程中的补充或对输出结果的筛选,命令模式十分灵活。

与之容易混淆的是egrep命令和fgrep命令。如果把grep命令当作是标准搜索命令,那么egrep则是扩展搜索命令,等价于“grep -E”命令,支持扩展的正则表达式。而fgrep则是快速搜索命令,等价于“grep -F”命令,不支持正则表达式,直接按照字符串内容进行匹配。

语法格式: grep [参数] 文件

常用参数:

参数 功能
-i 忽略大小写
-c 只输出匹配行的数量
-l 只列出符合匹配的文件名,不列出具体的匹配行
-n 列出所有的匹配行,显示行号
-h 查询多文件时不显示文件名
-s 不显示不存在、没有匹配文本的错误信息
-v 显示不包含匹配文本的所有行
-w 匹配整词
-x 匹配整行
-r 递归搜索
-q 禁止输出任何结果,已退出状态表示搜索是否成功
-b 打印匹配行距文件头部的偏移量,以字节为单位
-o -b结合使用,打印匹配的词据文件头部的偏移量,以字节为单位
-F 匹配固定字符串的内容
-E 支持扩展的正则表达式
  1. 搜索某个文件中,包含某个关键词的内容:
lucky@DESKTOP-VQ8KID4:~/shell$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
  1. 搜索某个文件中,以某个关键词开头的内容:
lucky@DESKTOP-VQ8KID4:~/shell$ grep ^root /etc/passwd
root:x:0:0:root:/root:/bin/bash
  1. 搜索多个文件中,包含某个关键词的内容:
root@DESKTOP-VQ8KID4:~# grep lucky /etc/passwd /etc/shadow
/etc/passwd:lucky:x:1000:1000:,,,:/home/lucky:/bin/bash
/etc/shadow:lucky:$6$SBxuPYFLSnBcfbHN$OkFFnnJCpf2P4OLOnnaWXMq.xbmgL3H5aRy4nkEkk/.8VHABaKDS6MdYm3UR3TpHZplAl5HVyffI8nbLlAAoh1:19256:0:99999:7:::
  1. 搜索多个文件中,包含某个关键词的内容,不显示文件名称:
root@DESKTOP-VQ8KID4:~# grep -h lucky /etc/passwd /etc/shadow
lucky:x:1000:1000:,,,:/home/lucky:/bin/bash
lucky:$6$SBxuPYFLSnBcfbHN$OkFFnnJCpf2P4OLOnnaWXMq.xbmgL3H5aRy4nkEkk/.8VHABaKDS6MdYm3UR3TpHZplAl5HVyffI8nbLlAAoh1:19256:0:99999:7:::
  1. 输出在某个文件中,包含某个关键词行的数量:
root@DESKTOP-VQ8KID4:~# grep -c root /etc/passwd /etc/shadow
/etc/passwd:1
/etc/shadow:1
  1. 搜索某个文件中,包含某个关键词位置的行号及内容:
lucky@DESKTOP-VQ8KID4:~/shell$ grep -n int nowcoder.txt
3:int main()
5:    int a = 10;
6:    int b = 100;
  1. 搜索某个文件中,不包含某个关键词的内容:
lucky@DESKTOP-VQ8KID4:~/shell$ grep -v int nowcoder.txt
#include <iostream>
using namespace std;
{
    cout << "a + b:" << a + b << endl;
    return 0;
}
  1. 搜索当前工作目录中,包含某个关键词内容的文件,未找到则提示:
root@DESKTOP-VQ8KID4:/# grep -l root *
grep: bin: Is a directory
grep: boot: Is a directory
grep: dev: Is a directory
grep: etc: Is a directory
grep: home: Is a directory
init
grep: lib: Is a directory
grep: lib32: Is a directory
...
grep: tmp: Is a directory
grep: usr: Is a directory
grep: var: Is a directory
  1. 搜索当前工作目录中,包含某个关键词内容的文件,未找到不提示:
lucky@DESKTOP-VQ8KID4:~/shell$ grep -sl main *
nowcoder.txt
  1. 递归搜索,不仅搜索指定目录,还搜索其内子目录内是否有关键词文件:
root@DESKTOP-VQ8KID4:/# grep -srl root /etc
/etc/services
/etc/ltrace.conf
/etc/systemd/logind.conf
/etc/crontab
/etc/newt/palette.ubuntu
/etc/xattr.conf
/etc/apparmor.d/tunables/home
...
  1. 搜索某个文件中,精准匹配到某个关键词的内容(搜索词应与整行内容完全一样才会显示,有别于一般搜索):
lucky@DESKTOP-VQ8KID4:~/shell$ grep -x "return 0;" nowcoder.txt
lucky@DESKTOP-VQ8KID4:~/shell$ grep -x "    return 0;" nowcoder.txt
    return 0;
  1. 判断某个文件中,是否包含某个关键词,通过返回状态值输出结果(0为包含,1为不包含),方便在Shell脚本中判断和调用:
lucky@DESKTOP-VQ8KID4:~/shell$ grep -q return nowcoder.txt
lucky@DESKTOP-VQ8KID4:~/shell$ echo $?  # 包含
0

lucky@DESKTOP-VQ8KID4:~/shell$ grep -q returns nowcoder.txt
lucky@DESKTOP-VQ8KID4:~/shell$ echo $?  # 不包含
1
  1. 搜索某个文件中,空行的数量:
lucky@DESKTOP-VQ8KID4:~/shell$ grep -c ^$ nowcoder.txt
0

sed:批量编辑文本文件

sed命令来自于英文词组“stream editor”的缩写,其功能是用于利用语法/脚本对文本文件进行批量的编辑操作。sed命令最初由贝尔实验室开发,后被众多Linux系统接纳集成,能够通过正则表达式对文件进行批量编辑,让需要重复的工作不再浪费时间。

sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。

sed命令行格式为:

sed [-nefri] ‘command’ 输入文本    

常用选项:

  • -n:使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
  • -e:直接在指令列模式上进行 sed 的动作编辑;
  • -f:直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
  • -r:sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
  • -i:直接修改读取的档案内容,而不是由萤幕输出。

常用命令:

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

常用参数:

参数 功能
-e 以指定的脚本来处理输入的文本文件
-f<script文件> 以指定的脚本文件来处理输入的文本文件
-h 显示帮助
-n 仅显示script处理后的结果
-V 显示版本信息

substr() :截取子串

第一种方法substr()配合awk命令

其语法格式:(开始索引以0或1开始)

substr(源字符串, 开始索引, 长度) 

例子:

lucky@DESKTOP-VQ8KID4:~$ cat nowcoder.txt
a12b8
10ccc
2521abc
lucky@DESKTOP-VQ8KID4:~$ awk -F" " '{print substr($1,2,3)}' nowcoder.txt
12b
0cc
521

正如上面提到的,开始索引以1开始和从0开始都一样:

lucky@DESKTOP-VQ8KID4:~$ awk -F" " '{print substr($1,0,3)}' nowcoder.txt
a12
10c
252
lucky@DESKTOP-VQ8KID4:~$ awk -F" " '{print substr($1,1,3)}' nowcoder.txt
a12
10c
252

第二种方法substr()配合expr命令

其语法格式为:(开始索引以1开始)

expr substr 字符串 开始索引 长度

例子:

lucky@DESKTOP-VQ8KID4:~$ expr substr "sdfsdf" 2 2
df

第三种方法:可以根据特定字符偏移和长度,使用另一种形式的变量扩展,来选择特定子字符串。【开始索引为0】

其语法格式为:

  1. 截取变量从n1到最后的字符串,其语法格式为:(只提供一个参数的话,默认截取到最后)
echo ${str:n1}
  1. 截取变量从n1n2之间的字符串。
echo ${str:n1:n2-n1}

题目解决方案

方法一:awk+sort+substr

很丝滑,可以说是一目了然了。关键在于怎么搜索出日期“23/Apr/2020”

awk '{
    if(substr($4, 2, 11) == "23/Apr/2020") res[$1]++;
}END{
    for(k in res){
        print res[k] " " k
    }
}' nowcoder.txt | sort -nr -k1 

当然,不用substr也可以:

awk '{
    if($0 ~ "23/Apr/2020") 
        res[$1]++;
}END{
    for(i in res){
    print res[i] " " i
    }
}' nowcoder.txt | sort -nrk1

正则表达式也可!

awk '{
    if ($4 ~ /\[23\/Apr\/2020.*/) {
        res[$1]++;
    }
}END {
    for(k in res) {
        print res[k] " " k
    }
}' nowcoder.txt | sort -r

方法二:grep+awk+sort

grep "23/Apr/2020" nowcoder.txt | awk '{print $1}' | sort | uniq -c | sort -nrk1 | awk '{print $1" "$2}'

方法三:sed+awk+sort

分为三个步骤:

  • sed -n '/\[23\/Apr/p' nowcoder.txt:正则匹配23号的IP
  • awk '{print $1}' | sort | uniq -c:打印IP,去重加重复次数
  • awk '{print $1,$2}' | sort -rk1:打印次数和IP,按重复次数逆序排序
sed -n '/\[23/,/Apr\/2020/p' | awk '{print $1}' | sort | uniq -c | sort -r | awk '{print $1,$2}'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Shell牛客刷题系列】SHELL23 nginx日志分析1-IP统计 的相关文章

随机推荐

  • 华为荣耀七能升级鸿蒙系统吗,华为鸿蒙系统来了,你知道哪些华为手机荣耀手机可以升级吗?...

    从鸿蒙系统第一次开始登场 到现在慢慢有许多鸿蒙系统设备出现 手机市场的格局似乎又要升级变化了 科技树儿了解到 在某数码博主经过和相关人员的沟通核实之后 目前暂定的是搭载华为麒麟710芯片以上的机型 无论华为或荣耀 都会升级华为鸿蒙Harmo
  • 深入理解Java比较器(Comparable和Comparator)

    深入理解Java比较器 Comparable和Comparator 文章目录 深入理解Java比较器 Comparable和Comparator 一 Comparable 1 Comparable 接口定义 二 Comparator 比较器
  • 6.11行为型---解释器模式

    在软件开发中 会遇到有些问题多次重复出现 而且有一定的相似性和规律性 如果将它们归纳成一种简单的语言 那么这些问题实例将是该语言的一些句子 这样就可以用 编译原理 中的解释器模式来实现了 虽然使用解释器模式的实例不是很多 但对于满足以上特点
  • vue实现导出excel,pdf功能

    实现导出excel pdf功能 注 代码中res就是后端返回的是文件流 前端使用a标签实现导出excel pdf 导出pdf跟excel的区别在于new blob对象时的type类型不同 下面代码是固定写法 可以直接使用 亲测有用哦 导出p
  • 【面试题】: bs架构与cs架构的区别以及各自优缺点

    一 前言 bs架构 Browser Server Architecture 和cs架构 Client Server Architecture 是常见的软件系统架构 bs架构是一种基于Web浏览器和Web服务器互联的架构 而cs架构则是一种由
  • 【VUE】npm install报错“found * vulnerabilities( * high), run npm audit fix, or npm audit”相关问题的解决

    前言 一个vue2的项目 从mac上传到gitee 然后windows clone之后npm install报错 原因 核心问题是node版本问题 windows11下载了node v16 然后版本过高导致各种无法resolve 需要降级为
  • 牛客模拟面试7月19

    说一说常用的 Linux 命令 常用的 Linux 命令有 命令 说明 cd 切换当前目录 ls 查看当前文件与目录 grep 通常与管道命令一起使用 用于对一些命令的输出进行筛选加工 cp 复制文件或文件夹 mv 移动文件或文件夹 rm
  • AI实战:深度学习必须使用大量数据?数据量对深度学习的重要性可能超乎你的想象!

    前言 最近 几个CV相关的项目陆续暴露出识别准确率不高的问题 导致客户反应强烈 其实在项目初期时我就指出过 只有千级的训练数据是无法训练出一个准确率高的模型的 在此写一篇博文记录一下 正文 数据量不够大 别玩深度学习 2017年 Jeff
  • Python之环境搭建

    1 安装 python 安装Python的流程图 如下 点击install 正在安装中 2 手动将python配置到系统环境 下面进行环境变量的配置 测试python环境是否搭建成功 1 WIN R 打开cmd 2 输入python 3 显
  • 再见乱码:5分钟读懂MySQL字符集设置

    摘要 在MySQL的使用过程中 了解字符集 字符序的概念 以及不同设置对数据存储 比较的影响非常重要 不少同学在日常工作中遇到的 乱码 问题 很有可能就是因为对字符集与字符序的理解不到位 设置错误造成的 本文由浅入深 分别介绍了如下内容 1
  • python爬虫入门教程!华为手机秒杀抢购助手

    前言 我们学习了网络爬虫的基本概念 通过网络爬虫我们可以批量下载文字 图片 视频等任意数据资源 在今天的课程中 我们将会给大家介绍关于网络爬虫更加深入的内容 一款能够进行华为手机商品秒杀的工具 只要你安装了Python环境就可以进行使用 零
  • JSX 标签自定义属性报错解决方法

    1 问题 不能将类型 class any xxx string yyy string zzz string 分配给类型 ElementAttrs
  • 车载以太网和工业以太网区别

    车载以太网使用单对非屏蔽电缆以及更小型紧凑的连接器 使用非屏蔽双绞线时可支持15m的传输距离 对于屏蔽双绞线可支持40m 这种优化处理使车载以太网可满足车载EMC要求 可减少高达80 的车内连接成本和高达30 的车内布线重量 100M车载以
  • 【满分】【华为OD机试真题2023 JAVA&JS】分奖金

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 分奖金 知识点栈 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 公司老板做了一笔大生意 想要给每位员工分配一些奖金 想通过游戏的方式来决定每个人分多少钱 按照员
  • SpringBoot-Kafka使用(一)

    一 简介 Kafka认识一下 Kafka异军突起 是近来非常火热的一款消息中间件 消息中间件的作用非常多 常用作系统业务的解耦 例如最常听到的秒杀业务 我们也能使用消息中间件对业务进行解耦 用户发起秒杀请求后 系统首先会将该请求转发到中间件
  • networkmanger开机自启动

    可以在系统设置中启用 NetworkManager 服务的开机自启动 如果使用的是 Ubuntu 系统 可以使用下面的命令开启 sudo systemctlenable NetworkManager service 然后重启系统 Netwo
  • 矩阵分析——LU分解

    LU分解初步 矩阵的LU分解主要用来求解线性方程组或者计算行列式 在使用初等行变换法求解线性方程组的过程中 系数矩阵的变化情况如下 由上可知 其中U就是上面矩阵A经过行变换后的上三角矩阵 Eij表示将i行元素与j行元素互换的初等矩阵 Eij
  • 谈民营企业股份制改制面临问题

    改革开放以来 民营企业是拉动中国经济增长的重要力量 是中国经济的重要组成部分 是国民经济发展的一支生力军 为国家经济发展做出了巨大的贡献 股份制改制对促进民营企业健康稳定发展起着至关重要的作用 然而 当前民营企业在股份制改制中存在产权不清晰
  • 【python数据挖掘课程】十.Pandas、Matplotlib、PCA绘图实用代码补充

    这篇文章主要是最近整理 数据挖掘与分析 课程中的作品及课件过程中 收集了几段比较好的代码供大家学习 同时 做数据分析到后面 除非是研究算法创新的 否则越来越觉得数据非常重要 才是有价值的东西 后面的课程会慢慢讲解Python应用在Hadoo
  • 【Shell牛客刷题系列】SHELL23 nginx日志分析1-IP统计

    该系列是基于牛客Shell题库 针对具体题目进行查漏补缺 学习相应的命令 刷题链接 牛客题霸 Shell篇 该系列文章都放到专栏下 专栏链接为 专栏 Shell 欢迎关注专栏 本文知识预告 本文首先复习了substr 截取字符串函数和sor