두 개의 변수가 포함된 디렉터리 파일의 개수를 계산한 다음 하나의 명령으로 이를 텍스트 파일에 넣는 방법

두 개의 변수가 포함된 디렉터리 파일의 개수를 계산한 다음 하나의 명령으로 이를 텍스트 파일에 넣는 방법

도움이 필요합니다.

a) TCP 및 UDP에 대한 매개변수 개수가 포함된 파일을 생성하는 명령을 작성합니다. 다른 프로토콜(예: IP 또는 XFRM)의 매개변수는 계산에 포함되어서는 안 됩니다.

이러한 매개변수는 /proc/sys/net/ipv4/의 개별 파일에 설정되며, 여기서 프로토콜(TCP 또는 UDP)은 파일 이름의 처음 몇 글자로 결정됩니다. 한 줄).

개별 명령은 파이프와 리디렉션을 사용할 수 있지만 명령을 단순히 결합할 수는 없습니다(예: ; 사용). 처음 몇 줄의 예는 다음과 같습니다:
63 tcp
3 udp

이것이 내가 지금까지 가지고 있는 것입니다:

ls -l /proc/sys/net/ipv4 | grep -n "tcp\|udp"| cut -d " " -f 10| cut -c 1-3 

답변1

이 경우 파일 수를 계산하기 위해 파이프나 리디렉션을 사용하는 대신 셸에서 이를 수행하도록 했습니다.

$ set -- /proc/sys/net/ipv4/tcp*
$ printf '%d tcp\n' "$#"
73 tcp
$ set -- /proc/sys/net/ipv4/udp*
$ printf '%d udp\n' "$#"
5 udp

또는 출력 파일에 씁니다.

{ set -- /proc/sys/net/ipv4/tcp*; printf '%d tcp\n' "$#"
  set -- /proc/sys/net/ipv4/udp*; printf '%d udp\n' "$#"; } >outputfile

이를 인위적으로 단일 복합 명령으로 변환할 수 있지만 누구도 다음과 같은 코드를 작성하지 않습니다.

$ set -- /proc/sys/net/ipv4/tcp* && printf '%d tcp\n' "$#" && set -- /proc/sys/net/ipv4/udp* && printf '%d udp\n' "$#"
73 tcp
5 udp

두 명령 세트 모두에서 파일 이름 와일드카드 패턴을 확장하고 위치 인수를 확장된 경로 이름 목록으로 설정한 다음 단순히 목록의 요소 수를 출력하여 파일 수를 계산합니다.

두 패턴 중 아무 것도 일치하지 않으면(0 대신 1) 잘못된 개수를 얻게 됩니다. 설정 nullglob의 셸 옵션을 통해 이 문제를 해결할 수 있습니다 bash.

이는 파일 이름에 줄 바꿈 및 기타 이상한 문자가 포함된 이론적인 코너 케이스에도 적용됩니다.


위와 동일한 작업을 수행하는 명령(예: awk및 로 시작하는 파일 이름의 발생 횟수 계산):tcpudp

awk '
    BEGIN {
        for (i=1;i<ARGC;++i) { sub(".*/","",ARGV[i]); sub("_.*","",ARGV[i]); c[ARGV[i]]++ }
        for (i in c) print i, c[i]
    }' /proc/sys/net/ipv4/{tcp,udp}*

답변2

-l권한, 소유권, 크기 등 파일 세부정보에는 관심이 없으므로 이 옵션이 필요하지 않습니다 . 파일 이름만 필요합니다.

grep명령은 효과가 없습니다. grep질문에서는 tcp 및 udp 파일을 별도로 계산하도록 요구하므로 어쨌든 도움이 되지 않습니다.

파일 수를 계산하려면 다음을 사용할 수 있습니다 ls|wc -l. 이름이 "tcp"로 시작하는 파일 수를 계산하려면: ls tcp*|wc -l. "udp"에 대해 동일한 작업을 수행하고 두 숫자를 하나의 에코로 결합합니다.

echo -e "$(ls /proc/sys/net/ipv4/tcp*|wc -l) tcp\n$(ls /proc/sys/net/ipv4/udp*|wc -l) udp" > out

개행 문자를 처리 해야 합니다 -e.

파일 이름에 개행 문자가 포함되어 있으면 작동하지 않지만 /proc/sys/net/ipv4에서는 그렇지 않다고 안전하게 가정할 수 있습니다.

질문을 다시 읽어보니 제 답변이 맞는지 잘 모르겠습니다. 매개변수가 아닌 파일만 계산합니다. 이제 가정을 해야 합니다. 매개변수는 해당 파일에 있는 단어입니다. 대부분의 파일에는 한 단어만 포함되어 있지만 일부 파일에는 더 많은 단어가 포함되어 있습니다. 단어 수를 계산하려면 wc -w대신 를 사용 ls하여 cat파일 내용에 액세스하세요.

echo -e "$(cat /proc/sys/net/ipv4/tcp*|wc -w) tcp\n$(cat /proc/sys/net/ipv4/udp*|wc -w) udp" > out

답변3

예제에서 누락된 것은 uniq -c다음과 같이 파이핑하는 것입니다.

ls -l /proc/sys/net/ipv4 | grep -n "tcp\|udp"| cut -d " " -f 10| cut -c 1-3 | uniq -c

내 시스템에서 실행할 때 얻는 결과는 다음과 같습니다.

$ ls -l /proc/sys/net/ipv4 | grep -n "tcp\|udp"| cut -d " " -f 10| cut -c 1-3 | uniq -c
     68 tcp
      5 udp

답변4

제가 생각해낸 해결책은 다음과 같습니다.

ls /proc/sys/net/ipv4 | grep "tcp\|udp" | cut -d "_" -f1 |sort |uniq -c > output.txt

모두의 도움에 감사드립니다 :)

관련 정보