tail -f /var/log/kern.log | sed 's/.* //'
터미널에 출력을 제공하지만 내가 할 때
tail -f /var/log/kern.log | sed 's/.* //' >> logfile.txt
파일에서 아무것도 찾을 수 없습니다. 커널 모듈에서 실행 파일의 이름을 인쇄합니다. 예 : 내가 실행하는 경우 ls
, kern.log
보유하고 /bin/ls
있지만, 타임 스탬프 등 메신저 경로 만 추출 위를 시도하고 한 내가 출력 파일로 리디렉션하지 않고 실행으로 작동 그래서, 나는 또한 시도와 함께 tee logfile.txt
. 여전히 아무것도 없습니다. 도와주세요.
sed 명령의 문제는 "뒤에 공백이 오는 모든 것"( ". *")을 취하고 "nothing"으로 대체한다는 것입니다. 해야 할 일은 모든 것을 첫 번째 공간까지 가져와 저장 한 다음 모든 것을 저장된 비트로 교체하는 것입니다. 입력 문자열의 일부를 저장하려면 정규식의 해당 부분을 괄호로 묶습니다. (.*)
그런 다음을 사용하여 대체 문자열에 넣을 수 있습니다 \1
.
그러나 그것보다 더 많은 것이 있습니다. sed는 탐욕 스럽습니다-가능한 한 많이 잡을 것입니다. 따라서 "abc def ghi"와 같은 문자열이 있으면 "abc def"뒤에 공백이있는 것을 볼 수 있으며 모든 것을 잡습니다. 그래서 질문은, 첫 번째 공간까지 첫 번째 부분을 어떻게 얻습니까?
구분 기호 (공백)가 아닌 뒤에 공백이 오는 모든 문자를 선택할 수 있습니다. 따라서 위의 예에서 c 와 d 사이의 문자 는 공백이므로 선택되지 않고 abc 부분 만 선택 됩니다.
따라서 최종 결과는 다음과 같습니다.
sed "s/\([^ ]*\) .*/\1/"`
여기서 일치하는 패턴은 "공백이 아닌 모든 것,있는만큼 많은 것"(이를 저장하기 위해 괄호 안에 있음) "([^ ]\*)"
, 단일 공간 " "
및 기타 모든 것으로 구성 ".*"
됩니다. 대체 문자열 "\1"
은 "첫 번째 괄호 집합의 정규식 부분과 일치하는 항목"입니다.
내가 한 빠른 테스트는 다음과 같습니다.
Testing: cat testout.txt
cat: testout.txt: No such file or directory
Testing: cat testin.txt
abc def ghi
asdf jkl; fdsa ;lkj qwerty 123
Once upon a time
When in the course
Testing: cat testin.txt | sed "s/\([^ ]*\) .*/\1/" >> testout.txt
Testing: cat testout.txt
abc
asdf
Once
When
Testing: cat testin.txt | sed "s/\([^ ]*\) .*/\1/" >> testout.txt
Testing: cat testout.txt
abc
asdf
Once
When
abc
asdf
Once
When
Testing:
testout.txt 에는 아무것도없고 testin.txt 에는 4 줄이 있습니다 . 그런 다음 testin.txt 의 내용 을 sed로 보내고 출력을 파일에 추가합니다. 그런 다음 내용을 보여줍니다. 그런 다음 실제로 추가되고 있음을 보여주기 위해 다시 한 번 수행했습니다 (이제 testout.txt에 8 줄 , 4 개씩 두 세트가 있습니다) (참고 : 읽기 쉽게하기 위해 빈 줄을 추가했습니다.)
궁금한 점이 있으면 알려주세요.
도움이 되었기를 바랍니다!
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다