天道酬勤,学无止境

How to print out a string between certain dates from log file

So I've got a log file that i need to search for certain strings and print out the lines that fall in between certain date ranges.

Ive got the first part done but im stuck on the second. How would i print out a string within a certain date. so say i want to print all strings between 2012-09-01 and 2012-09-15

Log Example:

 2012-09-13 16:04:22 DEBUG SID:34523 BID:1329 RID:65d33 'Starting new session'
 2012-09-13 16:04:30 DEBUG SID:34523 BID:1329 RID:54f22 'Authenticating User'
 2012-09-13 16:05:30 DEBUG SID:42111 BID:319 RID:65a23 'Starting new session'
 2012-09-13 16:04:50 ERROR SID:34523 BID:1329 RID:54ff3 'Missing Authentication token'
 2012-09-13 16:05:31 DEBUG SID:42111 BID:319 RID:86472 'Authenticating User'
 2012-09-13 16:05:31 DEBUG SID:42111 BID:319 RID:7a323 'Deleting asset with ID 543234'
 2012-09-13 16:05:32 WARN SID:42111 BID:319 RID:7a323 'Invalid asset ID'

This is my code so far:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Scanner;


public class ReadLogs {

   public static void main(String args[]) throws FileNotFoundException{
       String line, logString ="";
       Date startDate, endDate;

       ArrayList<String> logList = new ArrayList<>();

       Scanner logScanner = new Scanner(new        File("C:\\Users\\cmccarth\\Desktop\\logs.txt"));
       while (logScanner.hasNextLine()) {
            line = logScanner.nextLine();
            logList.add(line);                  
        }

       for (String z : logList) {
//          System.out.println(z);
        }


      // This function prints out all lines containing a specific string

       for( int i = 0; i <= logList.size() - 1; i++)
       {
           logString = logList.get(i);
           if(logString.contains("16:04:22")){
               System.out.println("String Contains" +logString);
           }

       }
   }     
}
标签

评论

Perform the following steps :

1) Create 2 Date objects with the date range you want to search in ( get these dates using Simple date format) :

 Date lowerRange; 
 Date upperRange;

2) Now loop through your filtered log list and okenize the string that you get from the log file and then get the date as tokens[0].

String[] tokens = logString.split(" ");
String dateStr = tokens[0];

// Convert this date to String using Simple Date Format
Date date = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH).parse(dateStr);

3) Now you can compare this date with the 2 dates that you have to see if it falls in the range.

if(date > lowerRange && date < upperRange)
{
  // this is the date you wanted...process the log file entry
}

Refer the following SO post for String to Date conversion : String-to-date

Try this sample code.

It is using Calendar, SimpleDateFormat and Pattern.

  • Calendar : to form a start date and end date along with time parameter
  • SimpleDateFormat : to parse a string into date object
  • Pattern : to get a specific pattern of date from the log

Here is the code:

   String[] logs = new String[] {

            "2012-09-13 16:04:22 DEBUG SID:34523 BID:1329 RID:65d33 'Starting new session'",
            "2012-09-13 16:04:30 DEBUG SID:34523 BID:1329 RID:54f22 'Authenticating User'",
            "2012-09-13 16:05:30 DEBUG SID:42111 BID:319 RID:65a23 'Starting new session'",
            "2012-09-13 16:04:50 ERROR SID:34523 BID:1329 RID:54ff3 'Missing Authentication token'",
            "2012-09-13 16:05:31 DEBUG SID:42111 BID:319 RID:86472 'Authenticating User'",
            "2012-09-13 16:05:31 DEBUG SID:42111 BID:319 RID:7a323 'Deleting asset with ID 543234'",
            "2012-09-13 16:05:32 WARN SID:42111 BID:319 RID:7a323 'Invalid asset ID'" };

    List<String> logList = new ArrayList<String>();
    for (String log : logs) {
        logList.add(log);
    }

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR, 2012);
    cal.set(Calendar.MONTH, 8);
    cal.set(Calendar.DATE, 13);
    cal.set(Calendar.HOUR_OF_DAY, 16);
    cal.set(Calendar.MINUTE, 4);
    cal.set(Calendar.SECOND, 30);
    cal.set(Calendar.MILLISECOND, 0);

    Date startDate = cal.getTime();

    cal.set(Calendar.MINUTE, 5);
    cal.set(Calendar.SECOND, 31);

    Date endDate = cal.getTime();

    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    Pattern pattern = Pattern.compile("^(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})");

    Matcher matcher = null;
    String logString = null;
    Date date = null;
    for (int i = 0; i < logList.size(); i++) {
        logString = logList.get(i);
        matcher = pattern.matcher(logString);

        if (matcher.find()) {
            try {
                date = format.parse(matcher.group());
                if (date.getTime() >= startDate.getTime()
                        && date.getTime() <= endDate.getTime()) {
                    System.out.println(logString);
                }
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }

    }

output: (logs between 2012-09-13 16:04:30 and 2012-09-13 16:05:31 inclusive)

2012-09-13 16:04:30 DEBUG SID:34523 BID:1329 RID:54f22 'Authenticating User'
2012-09-13 16:05:30 DEBUG SID:42111 BID:319 RID:65a23 'Starting new session'
2012-09-13 16:04:50 ERROR SID:34523 BID:1329 RID:54ff3 'Missing Authentication token'
2012-09-13 16:05:31 DEBUG SID:42111 BID:319 RID:86472 'Authenticating User'
2012-09-13 16:05:31 DEBUG SID:42111 BID:319 RID:7a323 'Deleting asset with ID 543234'

Try this(it works for me):

static void readdata(String startDate, String endDate) throws IOException, ParseException {
        String file = "your file location";
        List<String> logList = new ArrayList<String>();
        BufferedReader reader = new BufferedReader(new FileReader(file));
        String line = reader.readLine();
        while (line != null) {
            logList.add(line);
            // read next line
            line = reader.readLine();
        }
        reader.close();

        Pattern pattern = Pattern.compile("([12]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01]))");

        Matcher matcher = null;
        String logString = null;
        Date date = null;
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        for (int i = 0; i < logList.size(); i++) {
            logString = logList.get(i);
            matcher = pattern.matcher(logString);
            if (matcher.find()) {
                date = format.parse(matcher.group());

                Date st = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH).parse(startDate);
                Date ed = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH).parse(endDate);

                int res = st.compareTo(date);

                if (res <= 0) {

                    if (logString.contains(startDate)) {
                        {
                            System.out.println(logString);
                        }
                        continue;
                    }
                    if (date.after(ed)) {
                        break;
                    }

                    System.out.println(logString);
                }

            }
        }
    }

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何在过去几分钟内获取具有特定字符串值的所有日志(How to get all the logs with certain string value in the last a few minutes)
    问题 我有一个使用自己的日志文件格式的应用程序。 现在我想在一段时间内获取具有某些字符串值(例如“致命错误”)的所有日志行。 日志数据格式如下: Thread-28689296: Thu Aug 25 15:18:41 2016 [ info ]: abcd efddf Thread-28689296: Thu Aug 25 15:19:01 2016 [ info ]: xvbdfdre dfdfd Thread-28689296: Thu Aug 25 15:19:11 2016 [ info ]: Fatal error Thread-28689296: Thu Aug 25 15:19:41 2016 [ info ]: dfdfdfd 如果“现在”是 2016 年 8 月 25 日 15:19:41,我想在 15:19:41 和 15:17:41 之间找到我的日志文件中有“致命错误”的那些行。 因此,当前时间应从日期开始,x 分钟前应从“日期 x 分钟前”开始,以从应用程序日志中查找某些错误消息。 如果我使用以下命令行: awk -v Date="$(date "+%b %d %H:%M:%S %Y")" -v Date2="$(date -- date="2 minutes ago" "+%b %d %H:%M:%S %Y")" '$5 > Date && $5 <
  • 如何在 Perl 中将纪元时间转换为正常时间?(How do I convert epoch time to normal time in Perl?)
    问题 我正在尝试编写一个 Perl 脚本来解析日志,其中每一行的第二个值是日期。 该脚本接受三个参数:输入日志文件、开始时间和结束时间。 开始时间和结束时间用于解析位于这两个时间之间的每一行上的某个值。 但是为了正确运行它,我将开始和结束时间转换为纪元时间。 我遇到的问题是将循环“i”值转换回正常时间以与日志文件进行比较。 运行localtime($i)我打印了该值,但只看到打印的引用而不是实际值。 这是我到目前为止的脚本(这是一项正在进行的工作): #!/usr/bin/perl use strict; use warnings; use Time::Local; use Time::localtime; use File::stat; my $sec = 0; my $min = 0; my $hour = 0; my $mday = 0; my $mon = 0; my $year = 0; my $wday = 0; my $yday = 0; my $isdst = 0; ########################## # Get the engine log date ########################## my $date = `grep -m 1 'Metric' "$ARGV[0]" | awk '{print \$2}'`; ($year
  • 在 DD/MM/YYYY 和 YYYY-MM-DD 之间转换日期?(Converting date between DD/MM/YYYY and YYYY-MM-DD?)
    问题 使用 Python 脚本,我需要读取日期格式为 DD/MM/YYYY 的 CVS 文件,并将它们转换为 YYYY-MM-DD,然后再将其保存到 SQLite 数据库中。 这几乎有效,但失败了,因为我没有提供时间: from datetime import datetime lastconnection = datetime.strptime("21/12/2008", "%Y-%m-%d") #ValueError: time data did not match format: data=21/12/2008 fmt=%Y-%m-%d print lastconnection 我假设 datetime 对象中有一种方法可以非常轻松地执行此转换,但我找不到如何执行此操作的示例。 谢谢你。 回答1 您的示例代码是错误的。 这有效: import datetime datetime.datetime.strptime("21/12/2008", "%d/%m/%Y").strftime("%Y-%m-%d") 对 strptime() 的调用根据第二个参数中指定的格式解析第一个参数,因此这两个参数需要匹配。 然后您可以调用 strftime() 将结果格式化为所需的最终格式。 回答2 您首先需要将字符串转换为日期时间元组,然后将该日期时间元组转换为字符串,它会是这样的:
  • 如何获取使用Git在两个日期之间发生的所有提交之间的差异?(How can I get the diff between all the commits that occurred between two dates with Git?)
    问题 还是只是两个日期之间发生的所有提交? 在SVN中,您可以执行以下操作 svn diff -r{date}:{date} 去做吧! 我似乎找不到与之等效的Git。 具体来说,我正在研究编写脚本以发送每日电子邮件,其中包含当日提交的所有代码以及由谁提交的代码。 回答1 您可以使用git whatchanged --since="1 day ago" -p 它还需要一个--until参数。 文件 回答2 先前的建议有一些缺点。 基本上,我正在寻找与cvs diff -D"1 day ago" -D"2010-02-29 11:11" 。 在收集越来越多的信息的同时,我找到了解决方案。 我尝试过的事情: git whatchanged --since="1 day ago" -p从这里但是,即使一个文件中有多个提交,这也会为每个提交提供差异。 我知道git中的“日期”是个宽松的概念,我认为必须有某种方法可以做到这一点。 git diff 'master@{1 day ago}..master发出一些警告warning: Log for 'master' only goes back to Tue, 16 Mar 2010 14:17:32 +0100. 并且不显示所有差异。 git format-patch --since=yesterday --stdout对我没有任何帮助。
  • How to get all the logs with certain string value in the last a few minutes
    I have an application using its own log file format. Now I want to get all the lines of logs with certain string values such as "Fatal error" within a certain period of time. The log data format is like the following: Thread-28689296: Thu Aug 25 15:18:41 2016 [ info ]: abcd efddf Thread-28689296: Thu Aug 25 15:19:01 2016 [ info ]: xvbdfdre dfdfd Thread-28689296: Thu Aug 25 15:19:11 2016 [ info ]: Fatal error Thread-28689296: Thu Aug 25 15:19:41 2016 [ info ]: dfdfdfd If "now" is Aug 25 15:19:41 2016, I want to find between 15:19:41 and 15:17:41 those lines that have "Fatal error" in my log
  • Perl比bash快吗?(Is Perl faster than bash?)
    问题 我有一个bash脚本,该脚本在2个时间戳之间切出了一部分日志文件,但是由于文件的大小,它需要花费相当长的时间才能运行。 如果我要用Perl重写脚本,是否可以显着提高速度-还是必须转向C之类的工具才能完成此任务? #!/bin/bash if [ $# -ne 3 ]; then echo "USAGE $0 <logfile(s)> <from date (epoch)> <to date (epoch)>" exit 1 fi LOGFILES=$1 FROM=$2 TO=$3 rm -f /tmp/getlogs?????? TEMP=`mktemp /tmp/getlogsXXXXXX` ## LOGS NEED TO BE LISTED CHRONOLOGICALLY ls -lnt $LOGFILES|awk '{print $8}' > $TEMP LOGFILES=`tac $TEMP` cp /dev/null $TEMP findEntry() { RETURN=0 dt=$1 fil=$2 ln1=$3 ln2=$4 t1=`tail -n+$ln1 $fil|head -n1|cut -c1-15` dt1=`date -d "$t1" +%s` t2=`tail -n+$ln2 $fil|head -n1|cut -c1-15` dt2=`date
  • 计算Java / Groovy中的经过时间(Calculate elapsed time in Java / Groovy)
    问题 我有... Date start = new Date() ... ... ... Date stop = new Date() 我想获得这两个日期之间的年,月,日,小时,分钟和秒。 -- 我会细化这个问题。 我只想获取经过的时间(绝对值),而不考虑leap年,每个月的天数等。 因此,我认为无法获得过去的年月,我所能得到的只是几天,几小时,几分钟和几秒钟。 更具体地说,我想告诉您某项任务持续了例如 20 sec 13 min, 4 sec 2 h, 10 min, 2 sec 4 d, 4 h, 2 min, 2 sec 因此,请原谅我缺乏精确性。 回答1 我刚刚发现了这个来自Groovy的快速解决方案: import groovy.time.TimeCategory import groovy.time.TimeDuration Date start = new Date() // do something here Date stop = new Date() TimeDuration td = TimeCategory.minus( stop, start ) println td 回答2 您可以使用除法和mod来完成所有这些操作。 long l1 = start.getTime(); long l2 = stop.getTime(); long diff = l2 -
  • 在Bash中打印文件的最后修改日期(Print a file's last modified date in Bash)
    问题 我似乎找不到如何打印文件日期的方法。 到目前为止,我可以打印出目录中的所有文件,但是我需要打印出日期。 我知道我需要在条目的回显中附加日期格式,但是我找不到正确的格式。 echo "Please type in the directory you want all the files to be listed" read directory for entry in "$directory"/* do echo "$entry" done 回答1 您可以使用stat命令 stat -c %y "$entry" 更多信息 %y time of last modification, human-readable 回答2 'date'命令难道不是很简单吗? 不需要awk,stat等。 date -r <filename> 另外,考虑查看手册页中的日期格式; 例如,使用常见的日期和时间格式: date -r <filename> "+%m-%d-%Y %H:%M:%S" 回答3 最好的是 date -r filename +"%Y-%m-%d %H:%M:%S" 回答4 在OS X上,我希望文件输出中的日期格式为YYYY-MM-DD HH:MM 。 因此,要指定一个文件,我将使用: stat -f "%Sm" -t "%Y-%m-%d %H:%M" [filename]
  • 26道大题python实战练习-习题及源码 答案
    简述:这里有四个数字,分别是:1、2、3、4提问:能组成多少个互不相同且无重复数字的三位数?各是多少?Python解题思路分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。Python数学计算,编程练习题和答案实例一,源代码如下: #!/usr/bin/python # -*- coding: UTF-8 -*- for i in range(1, 5): for j in range(1, 5): for k in range(1, 5): if (i != k) and (i != j) and (j != k): print(i, j, k)Python数轴、长整型,编程练习题实例二:简述:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成.提问:从键盘输入当月利润I,求应发放奖金总数? 玩蛇网Python解题思路分析:请利用数轴来分界及定位。并要注意定义时需要把奖金定义成长整型的数据类型
  • 减去两个 Time:Piece 对象(To subtract two Time:Piece objects)
    问题 我想以分钟为单位获得时间之间的差异。 要比较的两个时间都在同一时区,所以不用担心时区差异等等。 假设Start_time = 14 Apr 2016 05:02:26 (从日志行收集)并且结束时间将是机器的当前时间, 我想计算end time - start time 。 为此,我需要开始时间采用当前时间的格式。 我尝试减去已经是 Time::Piece 对象的当前时间并将$start_time转换为 Time:Piece 对象。 但我收到“在 C:/Perl/lib/Time/Piece.pm 第 469 行,第 1071883 行解析时间时出错”。 错误。 请建议。 每次我运行脚本时,这个错误的“1071883”num 都会改变。 不确定它是一种垃圾值还是什么。 使用以下建议的答案编辑代码,我得到的结果低于输出。 似乎问题来了,因为 $now 包含像周六这样的 DAY 值,但我们的 $start_time 没有。 但是,当我们从日志文件中收集它时,我无法对开始时间进行任何更改,例如向其添加日期值。 如果问题是由于我所说的原因造成的,请建议如何从 $now 中忽略当天的价值。 输出 : last line of log: 16 Apr 2016 03:41:49 -- DEBUG -- 16 Apr 2016 03:41:49 Time is Sat Apr 16 03
  • How do I convert epoch time to normal time in Perl?
    I am attempting to write a Perl script that parses a log where on each line the second value is the date. The script takes in three arguments: the input log file, the start time, and the end time. The start and end time are used to parse out a certain value on each line that that falls between those two times. But to properly run this I am converting the start and end time to epoch time. The problem I am having is that to convert the loops 'i' value back to normal time to compare against the log file. After running localtime($i) I print the value and only see a reference printed not the actual
  • 在指定的时间范围内从日志文件中提取数据(Extract data from log file in specified range of time [duplicate])
    问题 这个问题已经在这里有了答案: 根据日期范围过滤日志文件条目(3个答案) 4年前关闭。 我想根据时间范围使用shell脚本(bash)从日志文件中提取信息。 日志文件中的一行如下所示: 172.16.0.3 - - [31/Mar/2002:19:30:41 +0200] "GET / HTTP/1.1" 200 123 "" "Mozilla/5.0 (compatible; Konqueror/2.2.2-2; Linux)" 我想提取数据特定间隔。 例如,我只需要查看最近一次记录的数据在过去X分钟或X天之前发生的事件。 我是Shell脚本的新手,但我尝试使用grep命令。 回答1 您可以为此使用sed 。 例如: $ sed -n '/Feb 23 13:55/,/Feb 23 14:00/p' /var/log/mail.log Feb 23 13:55:01 messagerie postfix/smtpd[20964]: connect from localhost[127.0.0.1] Feb 23 13:55:01 messagerie postfix/smtpd[20964]: lost connection after CONNECT from localhost[127.0.0.1] Feb 23 13:55:01 messagerie postfix
  • Count days between two dates with Java 8 while ignoring certain days of week
    Below I have 3 methods. The first is very simple. It just counts the total number of days. The second, however, will not only count the days, but will ignore the days of the week that are passed in to the method. My problem is that the third method is not always correct. It should match the second method. I am guessing it has something to do with leap years, because the difference is usually +=3|4 when it is incorrect. Additional Info I am attempting to mock Excel's weekday(serial_number,[return_type]) formula in a way. serial_number = startDate:Date - daysOfWeekToInclude:Array<Integer>
  • Shell函数可在特定时间尾随特定字符串的日志文件(Shell function to tail a log file for a specific string for a specific time)
    问题 我需要执行以下操作以确保我的应用服务器是 尾随日志文件中的特定字符串保持阻塞状态,直到打印出该字符串但是,如果在大约20分钟内未打印字符串,则退出并抛出异常消息,例如“服务器花费了20分钟以上的时间” 如果在日志文件中打印了字符串,请退出循环并继续。 有没有办法在while循环中包括超时? 回答1 #!/bin/bash tail -f logfile | grep 'certain_word' | read -t 1200 dummy_var [ $? -eq 0 ] && echo 'ok' || echo 'server not up' 这将读取写入日志文件的所有内容,搜索some_word,如果一切正常,则回显ok,否则在等待1200秒(20分钟)后发出抱怨。 回答2 您可以这样做: start_time=$(date +"%s") while true do elapsed_time=$(($(date +"%s") - $start_time)) if [[ "$elapsed_time" -gt 1200 ]]; then break fi sleep 1 if [[ $(grep -c "specific string" /path/to/log/file.log) -ge 1 ]]; then break fi done 回答3
  • 删除超过x天的文件(Delete files older than x days)
    问题 我如何确定使用Java创建文件的时间,因为我希望删除某个时间段之前的文件,目前我正在删除目录中的所有文件,但这并不理想: public void DeleteFiles() { File file = new File("D:/Documents/NetBeansProjects/printing~subversion/fileupload/web/resources/pdf/"); System.out.println("Called deleteFiles"); DeleteFiles(file); File file2 = new File("D:/Documents/NetBeansProjects/printing~subversion/fileupload/Uploaded/"); DeleteFilesNonPdf(file2); } public void DeleteFiles(File file) { System.out.println("Now will search folders and delete files,"); if (file.isDirectory()) { for (File f : file.listFiles()) { DeleteFiles(f); } } else { file.delete(); } } 上面是我当前的代码
  • 【面试宝典】软件测试工程师2021烫手精华版(第八章Python基础篇)
    第八章 Python 基础 斐波那契数列求 N? 字符串反序输出? print(a_str[::-1]) 判断回文? astr[::-1] == a_str 统计python 源代码文件中代码行数,去除注释,空行,进行输出? python 调用cmd 并返回结果? python 的 OS 模块。 • OS 模块调用CMD 命令有两种方式:os.popen(),os.system(). 都是用当前进程来调用。 • os.system 是无法获取返回值的。 当运行结束后接着往下面执行程序。 用法如: OS.system(“ipconfig”). • OS.popen 带返回值的,如何获取返回值。如 • p=os.popen(cmd) • print p.read().得到的是个字符串。 • 这两个都是用当前进程来调用,也就是说它们都是阻塞式的。管道 subprocess 模块。 • 运行原理会在当前进程下面产生子进程。 • sub=subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE) • sub.wait() • print sub.read() 冒泡排序 1,2,3,4 这 4 个数字,能组成多少个互不相同的且无重复的三位数,都是多少? 给定一个整数 N,和一个 0-9 的数 K,要求返回 0-N 中数字 K 出现的次数
  • 利用shell命令分析服务器日志
    在没有专业日志分析系统的情况下,我们有时需要对日志进行简单的分析,下面列出一些常用的shell命令分析日志的方法,一定要收藏1、查看有多少个ip访问awk '{print $1}' log_file|sort|uniq|wc -l2、查看某一个页面被访问的次数:grep "/index.php" log_file | wc -l3、查看每一个IP访问了多少个页面:awk '{++S[$1]} END {for (a in S) print a,S[a]}' log_file > log.txtsort -n -t ' ' -k 2 log.txt 配合sort进一步排序4、将每个IP访问的页面数进行从小到大排序:awk '{++S[$1]} END {for (a in S) print S[a],a}' log_file | sort -n5、查看某一个IP访问了哪些页面:grep ^111.111.111.111 log_file| awk '{print $1,$7}'6、去掉搜索引擎统计的页面:awk '{print $12,$1}' log_file | grep ^\"Mozilla | awk '{print $2}' |sort | uniq | wc -l7、查看2015年8月16日14时这一个小时内有多少IP访问:awk '{print $4,$1}' log
  • 使用Java 8计算两个日期之间的天数,而忽略一周中的某些天(Count days between two dates with Java 8 while ignoring certain days of week)
    问题 下面我有3种方法。 首先很简单。 它仅计算总天数。 但是,第二个不仅将计算天数,还将忽略传递给该方法的星期几。 我的问题是第三种方法并不总是正确的。 它应与第二种方法匹配。 我猜想这与leap年有关,因为当它不正确时,差异通常为+ = 3 | 4。 附加信息 我正在尝试以某种方式模拟Excel的weekday(serial_number,[return_type])公式。 serial_number = startDate:Date - daysOfWeekToInclude:Array<Integer> 例子 | A | B | C +---------+----------------------------------------------------+----------- 1 | Start | =DATE(2014,9,7) | 9/7/2014 2 | End | =DATE(2025,6,13) | 6/13/2025 3 | Include | ={1,2,4,6} (Mon, Tue, Thu, & Sat) | <Disp Only> 4 | Days | =SUM(INT((WEEKDAY($B$1-{1,2,4,6},1)+$B$2-$B$1)/7)) | 2248 这里有关于此功能的更多信息:如何在Excel中计算/计算两个日期之间的天数?
  • Linux find 用法示例
    Linux中find常见用法示例·find path -option [ -print ] [ -exec -ok command ] {} \;find命令的参数;pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。 -print: find命令将匹配的文件输出到标准输出。 -exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' { } \;,注意{ }和\;之间的空格。 -ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。#-print 将查找到的文件输出到标准输出 #-exec command {} \; —–将查到的文件执行command操作,{} 和 \;之间有空格 #-ok 和-exec相同,只不过在操作前要询用户例:find . -name .svn | xargs rm -rf====================================================-name filename #查找名为filename的文件 -perm #按执行权限来查找 -user username #按文件属主来查找 -group groupname #按组来查找
  • git:如何检索截至某个日期的所有文件(git: how to retrieve all files as of a certain date)
    问题 我确信这可以完成(?)(在clearcase中它会很简单)。 回答1 不要忘记文件时间戳不会记录在像 Git 这样的 DVCS 中。 那里只有提交时间戳,您可以轻松检出某个日期的提交。 git checkout master@{1 month 2 weeks 3 days 1 hour 1 second ago} (注意:这样的结账会给你一个分离的 HEAD) 在 ClearCase 中,这很容易,只要您将“保留文件时间”选项设置为 true 。 (如果没有,你实际上记录了每个文件的checkin时间,有点像Git commit时间戳,除了每个文件) 回答2 使用git log确定要切换到的合适版本,例如: git log --since='2010-04-01' --until='2010-04-02' 这将显示 2010-04-01 上的所有提交,因此只需选择与您想要文件的时刻相对应的提交,并记下其提交 ID。 然后只需使用git checkout COMMIT-ID将工作区切换到该提交。 这将从当前分支分离您的工作区(HEAD),使用git checkout master返回。 回答3 首先,您必须获取标识提交的字符串: git rev-list -n 1 --before="2009-07-27 13:37" origin/master 它打印字符串(例如 XXXX)