Board logo

标题: [文本处理] 批处理下使用findstr返回多行内容,如何只获取第一行? [打印本页]

作者: learninger    时间: 2023-11-10 18:20     标题: 批处理下使用findstr返回多行内容,如何只获取第一行?

如题,使用bat执行命令,返回结果用findstr处理,但是处理后有多条匹配结果,如何获取第一行内容。
例如,执行findstr /c “hello world”,返回有三行,
“hello world 1”
“hello world2”
“hello world 3”
现在只想获取第一行,如何处理
作者: Batcher    时间: 2023-11-10 22:00

回复 1# learninger


1.bat
  1. @echo off
  2. for /f "delims=" %%i in ('findstr /c:"hello world" "1.txt"') do (
  3.     echo,%%i
  4.     goto :Next
  5. )
  6. :Next
  7. pause
复制代码

作者: Five66    时间: 2023-11-10 23:04

@echo off
for /f "delims=" %%i in ('findstr /c "hello world" "aaa.txt"') do (
if not defined aaa set aaa=%%i
)
echo,"%aaa%"
pause
作者: learninger    时间: 2023-11-14 19:29

回复 2# Batcher


   

是这样的,我的代码是读取一个.txt的内容,把这个内容作为参数带入到一个命令里面,已经用了一次for循环,执行命令后会获取到一个很长的输出,然后我用findstr /c去获取含有关键参数的数据,但是返回了多行,以下是我的脚本,不太确定这个要怎么写

@echo off
title=test
for /f %%i in(testin.txt) do (
echo %%i>>result.txt
..\ipmitool.exe xxx(参数)| findstr /c:“Product Serial”>tmp.txt
set /p var=<tmp.txt && >>result.txt echo,%var%
echo.>>result.txt
)
pause

在.exe执行完后我会用findstr查找包含关键字product serial的行,但我只需要第一行,所以把他放在一个tmp文件中,取第一行出来追加到result里面,但是set /p var=<tmp.txt && >>result.txt echo,%var%这行命令拉出来单独执行是可行的,放到循环里不知道什么地方出问题了,它给result追加的是一个空行,请教一下这个要怎么改
作者: Batcher    时间: 2023-11-14 21:40

回复 4# learninger
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f %%i in (testin.txt) do (
  4.     >>result.txt echo,%%i
  5.     ..\ipmitool.exe xxx(参数)| findstr /c:"Product Serial" >tmp.txt
  6.     set /p var=<tmp.txt
  7.     >>result.txt echo,!var!
  8.     >>result.txt echo,
  9. )
  10. pause
复制代码

作者: learninger    时间: 2023-11-15 18:44

回复 5# Batcher


   学到了,加了变量延迟之后确实能读到内容了,但是问题又回到了取单行文本内容上,tmp文件里的三行内容全部被赋值给了var,最后写入result的是findstr筛选后的所有内容&#128514;
作者: Batcher    时间: 2023-11-15 18:58

回复 6# learninger


请把这行命令生成的tmp.txt文件打包上传到网盘,我看看。
  1. ..\ipmitool.exe xxx(参数)| findstr /c:"Product Serial" >tmp.txt
复制代码

作者: 不知道是谁    时间: 2023-11-15 20:12

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('type 1.txt^|findstr /c:"Product Serial"') do (
  4.     set /a num+=1
  5.     set var!num!=%%i
  6. )
  7. echo %var1%
  8. pause
复制代码

作者: Five66    时间: 2023-11-15 22:11

需要enabledelayedexpansion
需要清除set /p的内容,不然再次set /p时为空,就是上次的内容
  1. @echo off
  2. for /f %%i in (testin.txt) do (
  3. set "aaa=%%i"
  4. ..\ipmitool.exe xxx(参数)| findstr /c:"Product Serial" >tmp.txt
  5. setlocal enabledelayedexpansion
  6. echo,!aaa!>>result.txt
  7. set /p var=<tmp.txt
  8. echo,!var!>>result.txt
  9. echo,>>result.txt
  10. endlocal
  11. )
  12. pause
复制代码

作者: terse    时间: 2023-11-15 22:33

这样呢
  1. ..\ipmitool.exe xxx(参数)| findstr /c:"Product Serial" |cmd /v /c set /p s=^&echo !s!>>result.txt
复制代码

作者: aloha20200628    时间: 2023-11-15 23:26

回复 4# learninger

  1. @echo off &setlocal enabledelayedexpansion
  2. (for /f "delims=" %%i in (testin.txt) do (
  3. echo,%%i
  4. set "r1="
  5. for /f "delims=" %%s in ('..\ipmitool.exe xxx ^| findstr /c:"Product Serial" ') do if not defined r1 (set "r1=%%s")
  6. echo,!r1!
  7. ))>result.txt
  8. endlocal &exit/b
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2