in Programming

Windows Batch操作找到含字符串行并打印本行及后两行

小结

需要Windows Batch操作找到含字符串行并打印本行及后两行,找到办法并解决

问题及解决

有关回车换行的处理

回车换行是特殊字符,如果需要查找连续多行所包含的字符,需要处理回国换行符,参考Stackoverflow:What are the undocumented features and limitations of the Windows FINDSTR command?

由于正则表达式不会匹配 CRLF,需要进行特殊操作显式匹配,如果多行匹配了,只打印第一行。

TEXT.TXT文本包括以下内容

A
A
A
B
A
A

使用以下脚 本:

@echo off
setlocal
::Define LF variable containing a linefeed (0x0A)
::得到换行符Line Feed[行满]
set LF=^


::Above 2 blank lines are critical - do not remove

::Define CR variable containing a carriage return (0x0D)
::得到回车符Carriage Return, 导入之后使用约定变量CR, 调用者开启延迟变量使用[!CR!], 未开启延迟变量无法调用。所以copy /z到nul会生成一个CR字符。
for /f %%a in ('copy /Z "%~dpf0" nul') do set "CR=%%a"

setlocal enableDelayedExpansion
::regex "!CR!*!LF!" will match both Unix and Windows style End-Of-Line
findstr /n /r /c:"A!CR!*!LF!A" TEST.TXT

输出连续两行有字母A的结果如下:

1:A
2:A
5:A

循环并输出找到的所有行

循环并输出找到的所有行包括字符E000,打印本行,并打印找到的行的下两行。

@echo off

setlocal enableDelayedExpansion

rem Assemble the list of line numbers
set numbers=
for /F "delims=:" %%a in ('findstr /N /L "E000" test.txt') do (
   set /A current=%%a
   echo var1: !current!
   set /A before=%%a+1
   set /A after=%%a+2 

   set "numbers=!numbers!!current!: !before!: !after!: "
)

echo !numbers!
rem Search for the lines 

for /F "tokens=1* delims=:" %%a in ('findstr /N "^" test.txt ^| findstr /B "%numbers%"') do echo %%b    

以上,如果test.txt文件过大,则这个脚本就会不能运行。

参考

FOR /FLoop command
COPY Copy one or more files to another location.
FOR Conditionally perform a command several times.
FINDSTR Search for a text string in a file (or multiple files)
Stackoverflow:What are the undocumented features and limitations of the Windows FINDSTR command?
Stackoverlfow: What does %~d0 mean in a Windows batch file?
Stackoverflow: batch script to print previous and next lines of search string in a text file
Alternate method to get TAB, Carriage return and possibly all others

Tomcat启动的两个问题

小结 Tomcat服务碰到两个常见的问题,进行了解决。 问题及解决 Address already in use: JVM_Bind 端口被占用的问题经常会碰到,最常见的解决办法是把占用端口的进程进行关闭,或者是修改Tomcat使用的端口。如下: netstat -ano | find “80” taskkill /PID 73328 /F 实际上以下进程是不能杀掉的,这样就踢到铁板了。 C:\Users\Administrator>netstat -aon | find “80” … TCP 172.16.0.12:34905 172.16.22.40:8080 SYN_SENT 3712 找到3712的这样一个进程,发现是TmListen.exe,是Trend Micro的杀毒软件的。 C:\Users\Administrator>tasklist|findstr 3712 TmListen.exe 3712 Services 0 11,876 K 终极解决办法,重启计算机,问题解决。 No buffer space available ,tomcat启动报错 这个问题是个很诡异的错误,原因是部署的8080或8090 端口不在范围内。参考CSDN: No buffer space available ,tomcat启动报错,执行netsh int ipv4 […]