파일 중간에 특정 행을 표시하는 빠른 unix 명령?
서버와 관련된 문제를 디버깅하려고 하는데 로그 파일은 20GB 로그 파일(타임스탬프도 없음)뿐입니다!사람들이 사용하는 이유System.out.println() 목로으벌?생산 중?!
grep을 사용하여 파일의 347340107 줄을 보고 싶은 영역을 찾았습니다.
이런 일을 하는 것 말고는
head -<$LINENUM + 10> filename | tail -20
그것이 필요할 것입니다.head로그 파일의 첫 번째 3억 4천 7백만 줄을 읽으려면 347천 40100 - 347천 40200 줄을 콘솔에 덤프하는 빠르고 쉬운 명령이 있습니까?
업데이트 그렙이 일치하는 내용을 인쇄할 수 있다는 것을 완전히 잊었습니다...이것은 잘 작동합니다.감사합니다!
라인 번호는 알고 있지만 다른 방법은 없는 경우(grep 가능하지 않음) 다른 두 가지 해결책을 찾았습니다.
20번에서 40번 라인이 필요하다고 가정하면,
sed -n '20,40p;41q' file_name
또는
awk 'FNR>=20 && FNR<=40' file_name
을 할 때sed파일이 끝날 때까지 처리를 계속하는 것보다 마지막 줄을 인쇄한 후 처리를 종료하는 것이 더 효율적입니다.이는 대용량 파일 및 인쇄 줄의 경우에 특히 중요합니다.는 그게하기위해렇,위,sed▁instruction다니도▁the라는 지침을 소개합니다.41q예에서 우리는 20-40 라인에만 관심이 있기 때문에 41 라인 이후의 처리를 중지합니다.해야 할 에 1.41번을 추가해야 합니다.
# print line number 52
sed -n '52p' # method 1
sed '52!d' # method 2
sed '52q;d' # method 3, efficient on large files
방법 3 대용량 파일에서 효율적으로 사용
특정 선을 표시하는 가장 빠른 방법
GNU-grep으로 당신은 그냥 말할 수 있습니다.
grep --sys=10...
없습니다. 파일은 회선 주소 지정이 불가능합니다.
텍스트 파일에서 줄 n의 시작을 찾는 일정한 시간 방법은 없습니다.파일을 스트리밍하고 새 줄을 세야 합니다.
가장 간단하고 빠른 도구를 사용하여 작업을 수행합니다. 에게사를 사용해서, 용나.head보다 훨씬 더 말이 됩니다.grep후자가 훨씬 더 복잡하기 때문입니다."라고 말하는 게 아닙니다.grep느리다", 정말 그렇지 않지만, 만약 그것이 더 빠르다면 나는 놀랄 것입니다.head이 경우에는그것은 성가신 일입니다.head기본적으로
다음은 어떻습니까?
tail -n +347340107 filename | head -n 100
테스트는 하지 않았지만, 그게 효과가 있을 것 같습니다.
그냥들게더좋아요에 들어가는 합니다.less그리고.
- 파일의 절반으로 이동하기 위해 입력합니다.
- 43210G 43210호선으로 가다
:43210일을
그리고 그런 것들.
더 좋은 것은, 그 위치에서 편집을 시작하기 위해 (물론 vim에서!)를 치는 것입니다.자, 참고로vim키 바인딩이 같습니다!
표준 유닉스 편집기(현재 Vim의 일부)인 명령을 사용할 수 있습니다.
한 줄 표시(예: 두 번째 줄):
ex +2p -scq file.txt해당 sed 구문:
sed -n '2p' file.txt라인 범위(예: 2-5 라인):
ex +2,5p -scq file.txtsed 구문:
sed -n '2,5p' file.txt주어진 줄에서 끝까지(예: 5번째 줄에서 파일 끝까지):
ex +5,p -scq file.txtsed 구문:
sed -n '2,$p' file.txt다중 라인 범위(예: 2-4 및 6-8 라인):
ex +2,4p +6,8p -scq file.txtsed 구문:
sed -n '2,4p;6,8p' file.txt
위 명령은 다음 테스트 파일을 사용하여 테스트할 수 있습니다.
seq 1 20 > file.txt
설명:
+또는-c명령 뒤에 - 파일을 읽은 후 (vi/vim) 명령을 실행합니다.-s자동 모드, 또한 현재 단자를 기본 출력으로 사용합니다.q다음에-c편집기를 종료하는 명령입니다(추가).!강제 종료 등을 수행합니다.-scq!).
저는 먼저 파일을 이렇게 작은 파일들로 나누었습니다.
$ split --lines=50000 /path/to/large/file /path/to/output/file/prefix
그런 다음 결과 파일을 grep합니다.
줄 번호가 100인 경우
head -100 filename | tail -1
겟
Ubuntu/Debian 설치:
$ sudo apt-get install ack-grep
그런 다음 실행:
$ ack --lines=$START-$END filename
예:
$ ack --lines=10-20 filename
부터$ man ack:
--lines=NUM
Only print line NUM of each file. Multiple lines can be given with multiple --lines options or as a comma separated list (--lines=3,5,7). --lines=4-7 also works.
The lines are always output in ascending order, no matter the order given on the command line.
sed는 선을 세기 위해 데이터도 읽어야 할 것입니다.바로 가기를 사용할 수 있는 유일한 방법은 파일에 컨텍스트/순서가 있어야 합니다.예를 들어, 고정 너비 시간/날짜 등이 앞에 붙은 로그 선이 있는 경우.look unix 유틸리티를 사용하여 특정 날짜/시간에 대한 파일을 이진 검색할 수 있습니다.
사용하다
x=`cat -n <file> | grep <match> | awk '{print $1}'`
여기서 일치가 발생한 라인 번호를 확인할 수 있습니다.
이제 다음 명령을 사용하여 100줄을 인쇄할 수 있습니다.
awk -v var="$x" 'NR>=var && NR<=var+100{print}' <file>
또는 "sed"를 사용할 수도 있습니다.
sed -n "${x},${x+100}p" <file>
와 함께sed -e '1,N d; M q'N+1 ~ M 라인을 인쇄합니다.이것은 아마도 조금 더 나을 것입니다.grep -C선을 패턴에 맞추려고 하지 않기 때문입니다.
Sklivvz의 답변을 바탕으로, 여기에 넣을 수 있는 멋진 기능이 있습니다..bash_aliases파일. 파일 앞면에서 인쇄할 때 대용량 파일에 효율적입니다.
function middle()
{
startidx=$1
len=$2
endidx=$(($startidx+$len))
filename=$3
awk "FNR>=${startidx} && FNR<=${endidx} { print NR\" \"\$0 }; FNR>${endidx} { print \"END HERE\"; exit }" $filename
}
에서 선을 표시하는 방법<textfile>그 자체로<line#>다음과 같이 하십시오.
perl -wne 'print if $. == <line#>' <textfile>
정규식을 사용하여 다양한 줄을 보다 강력하게 표시하려면 -- grep가 이 작업을 수행하는 데 좋지 않은 이유를 설명하지 않겠습니다. 이 간단한 표현은 ~20GB 텍스트 파일을 처리할 때 원하는 범위를 단일 경로로 보여줍니다.
perl -wne 'print if m/<regex1>/ .. m/<regex2>/' <filename>
(팁: 정규식이 다음과 같은 경우)/그 안에서, 다음과 같은 것을 사용합니다.m!<regex>!대신)
이게하출니다됩력면이 출력됩니다.<filename>일하는줄시작부터에 일치하는 하는 것<regex1>일하는및라지인까포 ()▁that)에 <regex2>.
마법사가 몇 번의 수정을 통해 훨씬 더 강력한 성능을 얻을 수 있습니다.
마지막으로, 펄은 성숙한 언어이기 때문에 속도와 성능을 선호하는 숨겨진 기능이 많이 있습니다.원래 대용량 로그 파일, 텍스트, 데이터베이스 등을 처리하기 위해 개발되었기 때문에 이러한 작업에 대한 분명한 선택이 됩니다.
5행 인쇄
sed -n '5p' file.txt
sed '5q' file.txt
5행을 제외한 모든 것을 인쇄합니다.
`sed '5d' file.txt
그리고 구글을 이용한 나의 창작물.
#!/bin/bash
#removeline.sh
#remove deleting it comes move line xD
usage() { # Function: Print a help message.
echo "Usage: $0 -l LINENUMBER -i INPUTFILE [ -o OUTPUTFILE ]"
echo "line is removed from INPUTFILE"
echo "line is appended to OUTPUTFILE"
}
exit_abnormal() { # Function: Exit with error.
usage
exit 1
}
while getopts l:i:o:b flag
do
case "${flag}" in
l) line=${OPTARG};;
i) input=${OPTARG};;
o) output=${OPTARG};;
esac
done
if [ -f tmp ]; then
echo "Temp file:tmp exist. delete it yourself :)"
exit
fi
if [ -f "$input" ]; then
re_isanum='^[0-9]+$'
if ! [[ $line =~ $re_isanum ]] ; then
echo "Error: LINENUMBER must be a positive, whole number."
exit 1
elif [ $line -eq "0" ]; then
echo "Error: LINENUMBER must be greater than zero."
exit_abnormal
fi
if [ ! -z $output ]; then
sed -n "${line}p" $input >> $output
fi
if [ ! -z $input ]; then
# remove this sed command and this comes move line to other file
sed "${line}d" $input > tmp && cp tmp $input
fi
fi
if [ -f tmp ]; then
rm tmp
fi
다음 명령을 사용할 수 있습니다.
egrep -n "*" <filename> | egrep "<line number>"
Perl로 간편하게!파일에서 1, 3, 5행을 가져오려면 /etc/passwd:
perl -e 'while(<>){if(++$l~~[1,3,5]){print}}' < /etc/passwd
저는 (라마나 레디가) 출력에 라인 번호를 추가하자고 제안한 단 한 가지 다른 답변에 놀랐습니다.다음은 필요한 라인 번호를 검색하고 출력에 색상을 지정합니다.
file=FILE
lineno=LINENO
wb="107"; bf="30;1"; rb="101"; yb="103"
cat -n ${file} | { GREP_COLORS="se=${wb};${bf}:cx=${wb};${bf}:ms=${rb};${bf}:sl=${yb};${bf}" grep --color -C 10 "^[[:space:]]\\+${lineno}[[:space:]]"; }
언급URL : https://stackoverflow.com/questions/191364/quick-unix-command-to-display-specific-lines-in-the-middle-of-a-file
'programing' 카테고리의 다른 글
| django.db.dll 파일ProgrammingError: 관계가 이미 있습니다. (0) | 2023.05.04 |
|---|---|
| xcode에서 iOS App 아카이브를 생성할 수 없습니다. (0) | 2023.05.04 |
| 동일한 문서의 필드가 있는 Mongodb 쿼리 (0) | 2023.05.04 |
| Postgresql 스키마 경로 영구 설정 (0) | 2023.05.04 |
| ASP에서 사용자 정의 오류 페이지를 작동시키는 방법.NET MVC 4 (0) | 2023.05.04 |